Java 从连接池释放连接

Java 从连接池释放连接,java,connection,connection-pooling,Java,Connection,Connection Pooling,在我们的代码(通过计时器作为调度作业运行)中,我们有并行运行的线程来执行数据库操作。这里的问题是每个线程都通过Hibernate工厂启动连接。这些连接在每次数据库操作后都会关闭,但仍然会存储在连接池中(作为非活动)。只有在作业/主进程终止后,才会释放所有连接。是否有任何方法可以在数据库操作后从连接池释放连接。当我们使用cron作业而不是计时器时,进程会自动终止,但这里不需要cron。 请帮助我们解决这个问题,因为我们已经接近生产版本。 注意:当QA在作业上进行重负载测试时,我们知道了这一点,并且

在我们的代码(通过计时器作为调度作业运行)中,我们有并行运行的线程来执行数据库操作。这里的问题是每个线程都通过Hibernate工厂启动连接。这些连接在每次数据库操作后都会关闭,但仍然会存储在连接池中(作为非活动)。只有在作业/主进程终止后,才会释放所有连接。是否有任何方法可以在数据库操作后从连接池释放连接。当我们使用cron作业而不是计时器时,进程会自动终止,但这里不需要cron。 请帮助我们解决这个问题,因为我们已经接近生产版本。
注意:当QA在作业上进行重负载测试时,我们知道了这一点,并且每次负载都会拉入新的连接。您需要限制在线程池中创建的线程数量

dotConnect for Oracle使用连接池。OracleConnection连接字符串具有池参数。如果Pooling=true(默认值),则在关闭连接后不会删除该连接,而是将其放置到池中。当打开具有相同连接字符串的新连接时,将从池中获取该连接(若有空闲连接),而不是创建新连接。这提供了显著的性能改进。如果使用800个连接,每个连接持续10-15秒,并且只有少量不同的连接字符串,则可能没有800个实际连接。关闭的连接将被放置到池中,当具有相同连接字符串的新连接打开时,这些连接将从池中获取。在这种情况下,不会打开其他连接

您可以通过向连接字符串添加“Pooling=false”来禁用池。在这种情况下,将从内存中删除连接并释放会话。但是,这可能会导致性能损失

最有可能的是,池不应导致创建太多会话。尝试在启用池的情况下测试应用程序。如果会话号过大,可以禁用池


有关更多信息,请参阅

我已经找到了问题的根本原因,也找到了解决方案。 根本原因是设置为最小和最大的连接数以及超时参数。 最小值为5,最大值为20,超时时间为800秒。但out作业计划每分钟运行一次。由于配置原因,连接未在分钟内正确释放。 另一个问题是我们的代码没有将会话工厂作为单例使用,而是为每个线程初始化。由于资源未共享,每个会话工厂默认创建5个连接,并扩展到最多20个。由于释放连接之前的超时也更高,因此下一组作业将启动并创建自己的一组新连接。 最后,池变满,oracle变得不可用


我们通过共享会话对象并将超时值设置为较小的值来修复此问题,以便从池中释放连接。

听起来像是连接泄漏,而不是池。我们怀疑是相同的。但我们已经检查了代码,并确保已关闭所有连接。当我们关闭连接时,它会返回到池中,而不是释放,只有在邮件线程被终止时,池才会被释放。那么,我们能在不退出流程的情况下发布池吗?我们不能这样做,因为这是现有的遗留设计,人们现在不想改变任何东西。还有其他建议吗?比如中断线程或终止线程会释放池中的连接?池连接何时释放?线程永远不能被终止或停止。您需要限制创建的线程数。因此,另一种选择是在完成您已经在做的工作时关闭连接。您使用的是哪个数据库?检查文档,如果您可以限制可以在db端创建的连接数量,并且可以进行控制,我们使用的是oracle 11g。是的,我们可以通过线程池大小和其他参数限制相同。这里的另一个问题是,每次数据库调用时都会启动会话工厂,而不是作为单一实例在应用程序中通用。此外,如果我限制,线程必须等待其他线程释放连接。因此,在不知道如何释放池连接的情况下遇到了死锁。是否有手动释放池连接的选项?请参考回答。。修好了。。这是一个愚蠢的错误。。我找到了一个中间解决方案。我将最小和最大连接以及从池中释放连接的超时减少到1。。。。。这帮助我获得了稳定数量的连接。现在,我们在一些地方折射了代码以使用共享会话工厂。。。。这大大减少了连接数!!非常感谢你的建议。。。我们尚未对其进行全面测试……)