我正在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">
我注意到每次发生上述自动重新加载时,PostgreSQL数据库会多预留10个连接(因为在webapp的context.xml中initialSize="10")。 因此,在发生10次更改后,会抛出PSQLException异常:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
...
如果我手动重启Tomcat - 一切都很好,只有10个连接被保留。
有人知道解决此问题的方法吗?这样就可以将reloadable设置为“true”进行开发,而不会在每次重新加载上下文时池化更多的连接。
非常感谢任何帮助。
P.S. Apache Tomcat版本7.0.32