我正在 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”的情况下进行开发,并且每次重新加载上下文时都不会导致池化更多连接?
将不胜感激任何帮助。
PS Apache Tomcat 版本 7.0.32