【问题标题】:How to overcome "java.sql.SQLException: Too many connections" exception?如何克服“java.sql.SQLException:连接太多”异常?
【发布时间】:2010-02-03 16:42:46
【问题描述】:

我有一个用 java 编写的简单 Web 应用程序,它具有访问 Mysql 数据库以生成报告的 servlet。报告生成非常频繁。

我正在使用 apache commons DBCP 来连接到数据库。我也总是在 finally 块中明确关闭连接。但我没有明确关闭我创建的语句和结果集。

每次我收到“java.sql.SQLException: Too many connections”的异常时,我都不得不重新启动 tomcat 实例。

我该如何克服这个......我需要增加 Mysql 中的最大连接数吗?

感谢任何帮助。

【问题讨论】:

  • 您确定您的连接已关闭?
  • 你试过ConnectionPool吗?

标签: java mysql jdbc


【解决方案1】:
  • 是的,您应该关闭您的 Statements / ResultSets - 这些通常会引用原始 JDBC Connection 而不是 DBCP PooledDataSource 返回的 PooledConnection 代理 Connection
  • 考虑使用 C3P0 而不是 DBCP。
  • 考虑使用 Spring 来管理您的 JDBC 操作,您将永远不必担心这种事情。

【讨论】:

  • 是的。由于第一点,我认为真正真正的问题是语句/结果集。当您关闭委托连接(实际上返回池的连接)时,它不会关闭它的底层实际连接(它想保留它)。所以 RS 和 ST 永远不会关闭,并且资源已经耗尽。我不知道 C3P0 是否有一些东西可以自动克服这个问题,但如果你处理好这个问题,它一定能很好地工作。使用 DBCP。
  • 对不起 - 我关于 C3P0 的第二点是无关的;您仍然需要正确关闭连接和所有语句/结果集。它似乎比 DBCP 更受欢迎(如果您搜索 DBCP C3P0,您会明白我的意思)。
【解决方案2】:

使用连接池并在工作完成后始终关闭(返回池)连接。

http://dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html

【讨论】:

  • OP 已经通过在 Connection 上调用 close() 将连接返回到池中。
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多