当在 Tomcat 中启用上下文 reload=“true” 时,JDBC 连接池的连接用完解决方案长答案结论替代解决方案
我正在Eclipse Juno中开发一个Java EE Web应用程序。我已经将Tomcat配置为使用JDBC连接池(org.apache.tomcat.jdbc.pool)以及PostgreSQL数据库。以下是我项目的 META-INF/上下文中的配置.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 的上下文中.xml可重装属性设置为“true”,以便在检测到更改时自动重新装入 Web 应用程序:
<Context reloadable="true">
我注意到,每次发生上述自动重新加载时,都会保留10个与PostgreSQL db的连接(因为在webapp的上下文中.xml initialSize=“10”)。因此,在进行 10 次更改后,将抛出一个 PSQLException:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
...
如果我手动重新启动Tomcat - 一切都很好,只保留了10个连接。
有没有人知道解决这个问题的方法,所以有可能将可重新加载设置为“true”进行开发,并且每次重新加载上下文时都不会导致池化更多连接?
将不胜感激任何帮助。
附言 Apache Tomcat 版本 7.0.32