从连接池

时间:2017-05-19 06:17:58

标签: java connection connection-pooling

在我们的代码中(通过计时器作为计划作业运行),我们有并行运行的线程来执行数据库操作。这里的问题是每个线程都通过Hibernate工厂启动连接。这些连接在每次数据库操作后都会关闭,但stil会在连接池中存储(作为INACTIVE)。只有在作业/主进程被终止后才会释放所有连接。在数据库操作之后,有任何方法甚至可以从连接池释放连接。当我们使用cron job而不是timer时,进程会自动被杀死,但我们不需要cron。 请帮助我们解决这个问题,因为我们已经接近产品发布。 注意:当QA在工作中负载较重并且每次负载时,我们开始了解这一点。

2 个答案:

答案 0 :(得分:1)

您需要限制在线程池中创建的线程数。

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

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

最有可能的是,池化不应导致创建过多会话。尝试联合测试您的应用程序。如果会话编号太大,您可以禁用池。

有关详细信息,请参阅http://www.devart.com/dotconnect/oracle/docs/FAQ.html#q54

答案 1 :(得分:0)

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

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