【发布时间】:2011-12-06 21:55:09
【问题描述】:
我使用的是 Spring 2.5;使用 apache-commons-dbcp 连接池的 SimpleJdbcTemplate。还有一个线程池,它会在运行查询时生成一个线程(执行多个查询并在所有查询完成后处理它们的结果,因此会生成线程以并行运行查询)。
最终,所有线程都在 TIMED_WAIT 中等待 getConnection()。似乎没有线程获得连接。我检查了数据库,连接都是空闲的。
这是什么原因造成的?我有 10 个连接作为最大池大小和 50-100 个线程。我应该如何配置这个? DBA 说应该有足够的连接(我同意,因为它们都是空闲的)。
同样的事情也发生在 BoneCP 作为 SimpleJdbcTemplate 的数据源。
【问题讨论】:
-
猜,你没有明确关闭连接。
-
我不认为 OP 没有关闭连接,因为他正在使用
SimpleJdbcTemplate来妥善处理它。然而,显然这将是首先尝试的事情。但是你确定这些连接是空闲的吗?您有一百个线程并且只有 10 个连接...如果 SQL 查询占用了大部分线程时间,则保证 90 个线程等待连接,而其余 10 个线程实际上正在运行查询(可能在socketRead上等待结果)。您确定所有线程都在等待吗? -
SimpleJdbcTemplate 应该关闭它们。通过 JConsole 查看线程,是的,所有线程都在等待。完成查询平均不到 500 毫秒。我已经将它放置了超过 15 分钟,以确保它不是缓慢的查询,没有结果。
-
您是否在池中设置了验证查询?数据库是否会超时这些连接并且池不知道它?某种
select 1类型的查询在这里是合适的。 -
没有验证查询,所有连接都有效且正常工作。每当出现问题时,DBA 都会确认。在 DB 上,我们看到所有连接都在建立,它们只是空闲的。
标签: java spring connection-pooling apache-commons-dbcp bonecp