2016-10-26 23 views
9

Tôi đang sử dụng quy trình chèn hàng loạt Apache Camel SQL.Apache Camel SQL Chèn hàng loạt mất thời gian dài

  1. Ứng dụng của tôi đang đọc vé từ MQ hoạt động chứa khoảng 2000 vé.

  2. Tôi đã cập nhật hàng loạt như 100.

  3. Các truy vấn mà tôi đang bắn như sau: tuyến đường hàng loạt

    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 được định nghĩa như sau:

    <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. Dưới đây là mã java của tôi:

    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; 
    } 
    

Bây giờ vấn đề là khi có khoảng 120 vé trong ActiveMQ, SQL mẻ nên đã bắt đầu để chèn các giá trị trong cơ sở dữ liệu. Nhưng nó mất nhiều thời gian hơn. Nó bắt đầu quá trình chèn khi có khoảng 500 vé trong ActiveMQ. Có thể giúp đỡ bất kỳ khi tối ưu hóa quy trình chèn không? Hoặc bất kỳ cách tiếp cận nào khác?

Trả lời

6

Sự cố xảy ra với số người tiêu dùng ActiceMQ.

Khi tôi thay đổi số người tiêu dùng trở lại 1, lô nhận được cập nhật đúng giờ.

Thực tế, khi số lượng người tiêu dùng là 10, vé được sử dụng song song. Điều đó có nghĩa, với 100 vé được tiêu thụ từ activemq với 10 người tiêu dùng, có khoảng 10 vé với mỗi người tiêu dùng, do đó tăng thêm thời gian. Khi bất kỳ một trong những người tiêu dùng có 100 vé, lô đã được cập nhật.

Vì vậy, việc thay đổi số người tiêu dùng thành 1 đã đặt tất cả vé thành do người tiêu dùng duy nhất xử lý và do đó thực hiện cập nhật hàng loạt tiền phạt.

Các vấn đề liên quan