在JAVA中创建批处理时遇到问题,我可能每秒都要调用一个特定的连接来处理一个行块,达到池大小的限制。
如何在不增加池大小的情况下处理大量连接?
using (var connection = ExternalDBConnectionManager.getConnection()){
using (var prepStatement = connection.prepareStatement(queryToExecute)){
...
}
}
每100行或更多行调用此函数,但是例如我想每行运行一次(即500行,每次调用一次) - (这意味着用相同的函数调用此函数500次)连接)
答案 0 :(得分:0)
您应该阅读连接池以了解它们的工作原理。这里有数以百计的关于SO的主题。快速谷歌搜索"了解Java连接池"提供了一个库如何工作的小描述:How Connection Pooling Works
有关此SO主题的更多信息:How to establish a connection pool
基本上,您的客户端请求进入,您从池中获取连接,执行SQL操作,并在关闭连接时将其返回池中。这是高水平。
如果要将其与批处理相结合,则会变得有点棘手,因为您将获取数据,将其插入批处理中,然后在批处理中有一些预定数量的数据时触发发送/提交。
这实际上取决于您希望客户看到什么,他们在提交记录时是否需要确认?
使用池,您不太可能需要使用批处理,只需调整环境的连接池大小即可。
有许多独立的池库(C3PO和DBCP),并且许多各种服务(如websphere)已经内置了池。我相信Oracle jdbc驱动程序能够为你做到这一点。
答案 1 :(得分:0)
Universal Connection Pool (UCP)是一个Java连接池,具有丰富的功能,并与Oracle RAC,Oracle DG,Oracle ADG数据库架构紧密集成,充分利用了高可用性,故障转移和性能特性。
它是一个独立的ucp.jar,需要与JDBC驱动程序一起使用 关于UCP及其在OTN上的功能,有一些白皮书。
答案 2 :(得分:0)
你提到"批次"。通常批处理不使用为OLTP应用程序保留的连接池。这是因为如果连接被相当快地借用和释放,连接池就可以正常工作。批次通常会创建自己的连接,这些连接在批处理的生命周期内(可能是几小时)保持打开状态。