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
Ứng dụng của tôi đang đọc vé từ MQ hoạt động chứa khoảng 2000 vé.
Tôi đã cập nhật hàng loạt như 100.
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)
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>
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?