【发布时间】:2012-11-28 00:34:47
【问题描述】:
我正在 Eclipse Juno 中开发 Java EE Web 应用程序。我已将 Tomcat 配置为使用 JDBC 连接池 (org.apache.tomcat.jdbc.pool) 和 PostgreSQL 数据库。 以下是我项目的 META-INF/context.xml 中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Configuration for the Tomcat JDBC Connection Pool -->
<Resource name="jdbc/someDB"
type="javax.sql.DataSource"
auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/somedb"
username="postgres"
password="12345"
maxActive="100"
minIdle="10"
initialSize="10"
validationQuery="SELECT 1"
validationInterval="30000"
removeAbandoned="true"
removeAbandonedTimeout="60"
abandonWhenPercentageFull="50" />
</Context>
我的应用程序使用 Eclipse 部署到 Tomcat,并且在 Tomcat 的 context.xml 中,属性 reloadable 设置为“true”,以便在检测到更改时自动重新加载 Web 应用程序:
<Context reloadable="true">
我注意到,每次发生上述自动重新加载时,都会保留 10 多个与 PostgreSQL 数据库的连接(因为在 webapp 的 context.xml 中 initialSize="10")。所以在 10 次更改后会抛出 PSQLException:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
...
如果我手动重启 Tomcat - 一切都很好,只保留了 10 个连接。
是否有人知道解决此问题的方法,因此可以将 reloadable 设置为“true”进行开发,并且每次重新加载上下文时不会导致池化更多连接?
不胜感激。
附: Apache Tomcat 版本 7.0.32
【问题讨论】:
-
@Isaac “它已从 Tomcat 7.0.11 更正”,但我有 7.0.32 并且结果仍然相同。所以基本上这是一个错误?
-
可能是回归。如果您绝对确定您正在释放所有连接,但问题仍然存在,那么我会要求重新打开错误报告。
-
@Isaac 是的,关闭所有 ResultSets、Statements/PreparedStatements、finally 块中的连接。无论如何感谢您的帮助
-
context.xml 中有错字:validatonQuery="SELECT 1" 验证错过了一个 I。在复制/粘贴过程中注意到但没有机会编辑问题。
标签: java eclipse tomcat jdbc connection-pooling