2011-12-06 61 views
0

我使用Spring 2.5;一个使用apache-commons-dbcp连接池的SimpleJdbcTemplate。还有一个线程池在运行查询时产生一个线程(一旦完成所有查询并处理它们的结果,那么线程就会产生并行运行查询)。DB连接饥饿

最终,所有线程正在等待TIMED_WAIT中的getConnection()。没有线程似乎得到一个连接。我检查了数据库,连接全部空闲。

这是什么造成的?我有10个连接作为最大池大小和50-100个线程。我应该如何配置? DBA说应该有足够的连接(我同意,因为它们都是空闲的)。

同样的事情发生在BoneCP上,并且也是SimpleJdbcTemplate的数据源。

+0

猜测,您没有明确关闭连接。 –

+1

因为他使用'SimpleJdbcTemplate'来正确处理它,所以我不认为OP没有关闭连接。但显然这是第一次尝试。但是你确定这些连接闲置吗?你有100个线程,只有10个连接...如果SQL查询占用大部分线程时间,则90个线程保证等待连接,而剩余10个线程实际上正在运行查询(可能正在等待'socketRead'上的结果)。你确定所有的**线程都在等待吗? –

+0

SimpleJdbcTemplate应该关闭它们。在线程中查看JConsole,是的,所有人都在等待。查询的平均时间少于500毫秒。我已经离开它超过15分钟,以确保它不是查询缓慢,没有结果。 – dontocsata

回答

2

原来是因为在循环ResultSet的过程中,另一个查询已经启动,所以如果有足够的第一个查询,第二个查询就无法获得连接,并且一切都会死锁。