java - java - 如何从数组列表中对java中的存储过程调用进行多线程调用?
问题描述
我目前有一个运行单个存储过程的 java 程序,一次从一个数组列表调用一条记录,该数组列表循环直到所有记录都被处理。当前从存储过程调用返回每条记录大约需要 8 秒。完成调用后,它从 SP 获取 XML 消息并继续在代码中将该消息写入队列,然后更新数据库中的字段以将记录标记为已处理。
我想做的是让 x 数量的线程一次命中/调用存储过程,以加快整个数组列表的处理时间,并像现在一样继续执行其他步骤。数组列表可以是从几百条记录到超过 4000 条的任何地方。
有没有办法在调用后仍然通过相同的进程,但添加多线程以一次多次命中 SP,而所有内容都不会相互碰撞而导致问题?我只写了很短的时间,所以请多多包涵,谢谢!
public void callStoredProcedure(){
Connection conn = null;
DSConnection dsc = new DSConnection();
CallableStatement callableStatement = null;
/*
* stored procedure LWN_XML_PURCHASEORDER
*
* in_company IN NUMBER,
in_PO_NUMBER IN VARCHAR2,
in_po_release IN NUMBER,
in_po_code IN VARCHAR2,
in_object_TYPE IN VARCHAR2,
RET_CODE OUT NUMBER,
RET_MSG OUT CLOB)
*/
ArrayList<YmpohdroutDbo> PurchOrderList = new ArrayList<YmpohdroutDbo>(getInsertUpdatePurchOrders().values());
try {
//conn = dsc.getConnection();
ProcedureResult res;
for(int i=0;i<PurchOrderList.size();i++) {
conn = dsc.getConnection();
// calling SP
callableStatement = conn.prepareCall("{ call "+PurchaseOrder.dbProperties.getProperty("Schema") +".LWN_XML_PURCHASEORDER(?,?,?,?,?,?,?)}");
// register input fields of SP
callableStatement.setInt(1, PurchOrderList.get(i).getCompany());
callableStatement.setString(2, PurchOrderList.get(i).getPO_Number());
callableStatement.setInt(3, PurchOrderList.get(i).getPO_Release());
callableStatement.setString(4, PurchOrderList.get(i).getPO_Code());
callableStatement.setString(5, (PurchaseOrder.projProperties.getProperty(Constants.SEC_KEY_COMMENT_TYPE)));
// register output fields of stored procedure
callableStatement.registerOutParameter(6, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(7, java.sql.Types.CLOB);
// execute LWN_XML_PURCHASEORDER SP
callableStatement.execute();
res = new ProcedureResult();
res.setCode(callableStatement.getInt(6));
res.setMessage(callableStatement.getClob(7));
// send response from SP to MQ
PurchaseOrder.writeClobMQMessage(res.getMessage());
// mark record as processed
markRecordAsProcessed(PurchOrderList.get(i), conn);
DSConnection.close(conn, null, callableStatement, null);
}
} catch (Exception e) {
logger.error(e);
System.exit(1);
} finally {
if (callableStatement != null) {
try {
callableStatement.close();
} catch (SQLException e) {
logger.error(e);
}
}
if (conn != null) {
DSConnection.close(conn, null, callableStatement, null);
}
}
}
解决方案
您可以简单地启动多个线程,每个线程执行相同的方法 callStoredProcedure。唯一的变化是将 PurchOrderList 移出 callStoredProcedure 以使其对所有线程通用,并将其转换为队列而不是 ArrayList。
UPDT 这是生产者-消费者模式的一个特例,其中单个生产者填充队列,多个消费者从队列中获取项目(记录)。
推荐阅读
- java - 如何让我的 BFS 算法运行得更快?
- node.js - Fluent FFMPEG 复杂过滤器将文件拆分为多个输出
- pytest - Pytest - 是否可以创建一个过滤另一个夹具的夹具?
- python - 如何获取所需位置的组合列表的特定索引值
- python - matplotlib plt.figsize() 参数不适用于 pandas DataFrame 图
- r - R Shiny DT 行选择和行编辑冲突
- node.js - NGCC 运行 ng serve 时编译失败
- r - tmap/ tmaptools geocode_OSM 函数错误
- linux - 内核中多个缓冲区的 mmap 崩溃请帮助(使用 dma_mmap_coherent)
- python-3.x - 将文件夹 PYTHON 中的多个 pdf 转换为 txt