【问题标题】:DB Connection Starvation数据库连接饥饿
【发布时间】: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


【解决方案1】:

原来是因为在循环一个 ResultSet 的过程中,另一个查询开始了,所以第一个查询足够多,第二个查询无法获得连接,一切都死锁了。

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2010-11-12
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多