2014-09-26 22 views
0

我有一個包含80個字符串列的文件,其中有大約2個Lacs記錄。 我正在評估將來使用的技術,我們將獲得2000個Lacs記錄文件。 我已經評估2個東西與BufferedReader和JDBC Batch Inserts相比,Spring Batch Perfomance爲什麼少?

甲骨文11克數據庫

方法1 - 春天批次的該

配置是如下

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch 
     http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

    <batch:job id="trialDataLoadJob"> 
     <batch:step id="step1"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="trialInputFileReader" writer="trialJdbcWriter" commit-interval="1000"/> 
      </batch:tasklet> 
     </batch:step> 
    </batch:job> 

    <bean id="trialInputFileReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> 
     <property name="resource" value="file:#{jobParameters[inputFile]}" /> 
     <property name="linesToSkip" value="1" /> 
     <property name="lineMapper"> 
      <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
       <property name="lineTokenizer" ref="trialLineTokenizer" /> 
       <property name="fieldSetMapper" ref="trialFieldSetMapper" /> 
      </bean> 
     </property> 
    </bean> 


    <bean id="trialLineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
     <property name="delimiter" value="," /> 
     <property name="names" 
      value="RUN_DATE,ACODE,GMI_ACCOUNT,GMI_OFFICE,GMI_FIRM,ACCOUNT_NAME,CCY,LE_ID,MARKET,GMF,MIC_CODE,GMI_PRD,PRD,PRD_DESCRIPTION,BBG_BACK_OFFICE_TICKER,BBG_FRONT_OFFICE_TICKER,BBG_YELLOW_KEY,ROOT_RIC,RIC,TRADE_TYPE,PROMPT_DATE,EXPIRY_DECLARATION,LAST_TRADED_DATE,STRIKE_PRICE,OPTION_TYPE,DELIVERY_TYPE,TRADE_PRICE,DECIMAL_TRADE_PRICE,TRIAL_TRADEPRICE,CONTRACTS,NOTIONAL_FOR_FUTURES,CLEARING_BROKER,EXEC_BROKER,TRADE_DATE,TRANSACTION_TYPE,UNDERLYING,UNDERLYING_TYPE,GMI_MULTIPLIER,UTI,USI,ISIN,AII,CFI,SERIAL,DEALER_REFERENCE,TRADE_EXECUTION_ID,CLEARING_TIMESTAMP,EXECUTION_TIMESTAMP,CCP_LE_ID,SWAP_TYPE,EFFECTIVE_DATE, COUPON_RATE,DAY_COUNT_BASIS,ROLL_FREQUENCY,RESET_FREQUENCY,ACTIVITY_TYPE,EMPTY,PRD_ID_PREFIX_1,PRD_ID_PREFIX_2,TRIAL_ENTITY_NAME,TRIAL_ENTITY_LEI,TRIAL_REGION" /> 
     <property name="strict" value="false"></property> 
    </bean> 

    <bean id="demo" class="com.mkyong.Demo"></bean> 


     <bean id= "trialFieldSetMapper" class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
      <property name="prototypeBeanName" value="demo" /> 
     </bean> 
     <bean id="trialJdbcWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
     <property name="dataSource" ref="dataSource" /> 

     <property name="sql"> 
      <value> 
      <![CDATA[   
      Insert into TB_TRANS(RUN_DATE,ACODE,GMI_ACCOUNT,GMI_OFFICE,GMI_FIRM,ACCOUNT_NAME,CCY,LE_ID,MARKET,GMF,MIC_CODE,GMI_PRD,PRD,PRD_DESCRIPTION,BBG_BACK_OFFICE_TICKER,BBG_FRONT_OFFICE_TICKER,BBG_YELLOW_KEY,ROOT_RIC,RIC,TRADE_TYPE,PROMPT_DATE,EXPIRY_DECLARATION,LAST_TRADED_DATE,STRIKE_PRICE,OPTION_TYPE,DELIVERY_TYPE,TRADE_PRICE,DECIMAL_TRADE_PRICE,TRIAL_TRADEPRICE,CONTRACTS,NOTIONAL_FOR_FUTURES,CLEARING_BROKER,EXEC_BROKER,TRADE_DATE,TRANSACTION_TYPE,UNDERLYING,UNDERLYING_TYPE,GMI_MULTIPLIER,UTI,USI,ISIN,AII,CFI,SERIAL,DEALER_REFERENCE,TRADE_EXECUTION_ID,CLEARING_TIMESTAMP,EXECUTION_TIMESTAMP,CCP_LE_ID,SWAP_TYPE,EFFECTIVE_DATE, COUPON_RATE,DAY_COUNT_BASIS,ROLL_FREQUENCY,RESET_FREQUENCY,ACTIVITY_TYPE,EMPTY,PRD_ID_PREFIX_1,PRD_ID_PREFIX_2,TRIAL_ENTITY_NAME,TRIAL_ENTITY_LEI,TRIAL_REGION) 
      values (:RUN_DATE,:ACODE,:GMI_ACCOUNT,:GMI_OFFICE,:GMI_FIRM,:ACCOUNT_NAME,:CCY,:LE_ID,:MARKET,:GMF,:MIC_CODE,:GMI_PRD,:PRD,:PRD_DESCRIPTION,:BBG_BACK_OFFICE_TICKER,:BBG_FRONT_OFFICE_TICKER,:BBG_YELLOW_KEY,:ROOT_RIC,:RIC,:TRADE_TYPE,:PROMPT_DATE,:EXPIRY_DECLARATION,:LAST_TRADED_DATE,:STRIKE_PRICE,:OPTION_TYPE,:DELIVERY_TYPE,:TRADE_PRICE,:DECIMAL_TRADE_PRICE,:TRIAL_TRADEPRICE,:CONTRACTS,:NOTIONAL_FOR_FUTURES,:CLEARING_BROKER,:EXEC_BROKER,:TRADE_DATE,:TRANSACTION_TYPE,:UNDERLYING,:UNDERLYING_TYPE,:GMI_MULTIPLIER,:UTI,:USI,:ISIN,:AII,:CFI,:SERIAL,:DEALER_REFERENCE,:TRADE_EXECUTION_ID,:CLEARING_TIMESTAMP,:EXECUTION_TIMESTAMP,:CCP_LE_ID,:SWAP_TYPE,:EFFECTIVE_DATE,:COUPON_RATE,:DAY_COUNT_BASIS,:ROLL_FREQUENCY,:RESET_FREQUENCY,:ACTIVITY_TYPE,:EMPTY,:PRD_ID_PREFIX_1,:PRD_ID_PREFIX_2,:TRIAL_ENTITY_NAME,:TRIAL_ENTITY_LEI,:TRIAL_REGION) 
      ]]> 
      </value> 
     </property> 
     <property name="itemSqlParameterSourceProvider"> 
      <bean 
       class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" /> 
     </property> 
    </bean> 
</beans> 

花118秒2, 00,000條記錄。

方法2 - 的BufferedReader & JDBC批處理

Connection connection = dbManager.getConnection(); 
    File file = new File(filePath); 
    BufferedReader br = null; 
    boolean error = false; 
    ArrayList<String[]> records = new ArrayList<String[]>(batchSize * 2); 
    try { 
     connection.setAutoCommit(false); 
     br = new BufferedReader(new FileReader(file)); 
     String line; 
     while ((line = br.readLine()) != null) { 
//  System.out.println(line); 
     String[] values = line.split(",",-1); 
     records.add(values); 
     if (records.size() == batchSize) { 
      insertToDB(records, connection); 
      records.clear(); 
     } 
     } 

     if (records.size() > 0) { 
     insertToDB(records, connection); 
     } 

    } catch (FileNotFoundException e) { 
     error = true; 
     e.printStackTrace(); 
    } catch (IOException e) { 
     error = true; 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     error = true; 
     e.printStackTrace(); 
     DBManager.rollback(connection); 
    } finally { 
     if (br != null) 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (!error) { 
     DBManager.commitConnection(connection); 
     } 

     if (DBManager.isConnectionClosed(connection)) 
     DBManager.closeConnection(connection); 

    } 

花了3秒1,00,000記錄。

爲什麼Spring Batch Version 3速度慢?我有相反的印象。

+0

用於該休眠(例如)較慢相比原始JDBC使用相同的原因:框架 - 由於它們的框架的性質 - 因爲是更復雜然後一段直的代碼生成開銷(您的代碼沒有按」我不介意可重啓性,我想。 框架通常需要配置微調階段才能達到最佳性能 – 2014-09-26 09:28:38

回答

0

將數據加載數字轉換爲標準,可能是磨機而不是十萬。這對其他人理解數據負載計數會很有幫助。

嘗試從spring-batch中刪除/隱藏調試和sops,它可能有所幫助。

我已經用以下記錄計數運行示例作業。

emp records = 2,211,840 
add records = 4,423,680 
spl records = 13,271,040 
hibernateJobStartTime : Mon Sep 01 01:15:35 EDT 2014 
hibernateJobEndTime : Mon Sep 01 02:06:55 EDT 2014