2016-10-26 8 views
9

私はApache Camel SQLバッチ挿入プロセスを使用しています。Apache Camel SQLバッチ挿入に長時間を要する

  1. 私のアプリケーションは、約2,000のチケットを含むアクティブMQからチケットを読み取ります。

  2. 私は次のように私は発射していたクエリがある100

  3. としてバッチを更新しました:

    sql.subs.insertCdr= insert into subscription_logs(master_id,request_type,req_desc,msisdn,amount,status,resp_code,resp_desc,channel,transaction_id,se_mode,be_mode,sub_type,sub_timeleft,srv_name,srv_id,start_date,end_date,operator,circle,country,time_offset,retry_count,user_status,previous_state,se_reqrecvtime,se_respsenttime,be_reqsenttime,be_resprecvtime,cp_id,cp_name,sub_srvname,sub_srvid,msg_senderid,msg_text,call_back_url,call_back_resp,client_ip,se_sysIp,language,cp_callbackurlhittime,action,alert,notification_url,notification_resp) values(:#masterId, :#requestType,:#reqDesc,:#msisdnCdr,:#price,:#status,:#responseCode,:#reason,:#channel,:#transactionId,:#seMode,:#beMode,:#subType,:#subTimeLeft,:#serviceName,:#serviceId,:#subStartDate,:#cdrEndDate,:#operator,:#circle,:#country,:#timeOffset,:#retryCount,:#userStatus,:#previousState,:#seReqRecvTime,:#seRespSentTime,:#beReqSentTime,:#beRespRecvTime,:#cpId,:#cpName,:#subServiceName,:#subServiceId,:#shortCode,:#message,:#callBackUrl,:#callBackResp,:#clientIp,:#seSysIp,:#language,:#cpCallbackUrlHitTime,:#action,:#alert,:#notificationUrl,:#notificationResponse)

  4. 次のようにSQLバッチのルートが定義されています

    <pipeline> 
        <log message="Going to insert in database"></log> 
        <transform> 
         <method ref="insertionBean" method="subsBatchInsertion"></method> 
        </transform> 
        <choice> 
         <when> 
          <simple>${in.header.subsCount} == ${properties:batch.size}</simple> 
          <to uri="sql:{{sql.subs.insertCdr}}?batch=true"></to> 
          <log message="Inserted rows ${body}"></log> 
         </when> 
        </choice> 
    </pipeline> 
    
  5. 以下は私のJavaコードです:

    public List<Map<String, Object>> subsBatchInsertion(Exchange exchange) { 
    if (subsBatchCounter > batchSize) { 
        subsPayLoad.clear(); 
        subsBatchCounter = 1; 
    } 
    subsPayLoad.add(generateInsert(exchange.getIn().getBody(SubscriptionCdr.class))); 
    exchange.getIn().setHeader("subsCount", subsBatchCounter); 
    subsBatchCounter++; 
    return subsPayLoad; 
    } 
    
    public Map<String, Object> generateInsert(Cdr cdr) { 
    Map<String, Object> insert = new HashMap<String, Object>(); 
    try { 
        insert = BeanUtils.describe(cdr); 
    } catch (Exception e) { 
        Logger.sysLog(LogValues.error, this.getClass().getName()+" | "+Thread.currentThread().getStackTrace()[1].getMethodName(), coreException.GetStack(e)); 
    } 
    for (String name : insert.keySet()) { 
        Logger.sysLog(LogValues.APP_DEBUG, this.getClass().getName(), name + ":"+ insert.get(name) + "\t"); 
    } 
    return insert; 
    } 
    

今の問題は、ActiveMQので120チケットの周りに存在する場合には、SQLバッチがデータベースに値を挿入し始めているはずです。しかし、それはより多くの時間がかかります。 ActiveMQに約500のチケットがある場合、挿入プロセスを開始します。 挿入プロセスの最適化にanyboodyヘルプを使用できますか? または他のアプローチですか?

答えて

6

問題は、ActiceMQのコンシューマ番号で問題になりました。

私が消費者数を1に戻したとき、バッチは時間通りに に更新されました。

実際、消費者数が10の場合、チケットは並行して消費されました。つまり、10人の消費者でactivemqから消費されたチケット100枚につき、消費者ごとに約10枚のチケットがあり、時間が増えました。消費者の誰かが100枚のチケットを取得すると、バッチは更新されていました。だから、1に、消費者の数を変更

は、単一の消費者によって処理 するすべてのチケットを作ったので、バッチ更新に 罰金を実行します。

関連する問題