从DriverManager切换到Tomcat / Postgres JNDI池后,我遇到了Tomcat重启后直接部署的应用程序使用的所有连接的问题。即使在检查了几个类似的帖子后,我也无法找到解决这个问题的方法。
我根据此example配置了连接池。
这是我的数据源声明,我将其放入$CATALINA_BASE/conf/context.xml
中,因此我假设它将用于所有应用程序。
<Resource name="jdbc/dbResource" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/db"
username="admin" password="pass" maxActive="20" maxIdle="10" maxWait="-1" />
在应用程序web.xml中,我有资源定义
<resource-ref>
<description>pg db datasource</description>
<res-ref-name>jdbc/dbResource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
修改
在我的源代码中,我通过InitialContext对象获得连接:
DataSource ds = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/dbResource");
connection = ds.getConnection();
结束编辑
根据我的catalina.out日志文件中的错误消息,似乎使用了池。
但是在重新启动tomcat之后我有很多这样的空闲连接:
4679 ? Ss 0:00 postgres: admin db 127.0.0.1(41577) idle
4680 ? Ss 0:00 postgres: admin db 127.0.0.1(41578) idle
4681 ? Ss 0:00 postgres: admin db 127.0.0.1(41579) idle
4682 ? Ss 0:00 postgres: admin db 127.0.0.1(41580) idle
4683 ? Ss 0:00 postgres: admin db 127.0.0.1(41581) idle
4684 ? Ss 0:00 postgres: admin db 127.0.0.1(41582) idle
4685 ? Ss 0:00 postgres: admin db 127.0.0.1(41583) idle
4686 ? Ss 0:00 postgres: admin db 127.0.0.1(41584) idle
4687 ? Ss 0:00 postgres: admin db 127.0.0.1(41585) idle
4688 ? Ss 0:00 postgres: admin db 127.0.0.1(41586) idle
4885 ? Ss 0:00 postgres: admin db 127.0.0.1(41650) idle
4886 ? Ss 0:00 postgres: admin db 127.0.0.1(41651) idle
4887 ? Ss 0:00 postgres: admin db 127.0.0.1(41652) idle
4888 ? Ss 0:00 postgres: admin db 127.0.0.1(41653) idle
4889 ? Ss 0:00 postgres: admin db 127.0.0.1(41654) idle
4890 ? Ss 0:00 postgres: admin db 127.0.0.1(41655) idle
4891 ? Ss 0:00 postgres: admin db 127.0.0.1(41656) idle
4892 ? Ss 0:00 postgres: admin db 127.0.0.1(41657) idle
4893 ? Ss 0:00 postgres: admin db 127.0.0.1(41658) idle
4894 ? Ss 0:00 postgres: admin db 127.0.0.1(41659) idle
从pgAdmin查询服务器状态时,它还会将SET extra_float_digits = 3
称为每个连接的查询,我不知道这些可能来自哪里。
要测试,如果我正确地关闭了所有连接,语句和ResultSet,我从代码中删除了所有数据库连接并再次将其部署到tomcat。即使是现在,这些空闲连接也会出现所以我想,不是我的应用程序有连接泄漏,而是底层池的配置问题。
对我来说真正的问题是,在这种状态下,查询我的应用程序会导致错误消息
Mar 24, 2017 11:53:14 AM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: FATAL: remaining connection slots are reserved for non-replication superuser connections
Mar 24, 2017 11:53:14 AM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:582)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:185)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:144)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:410)
at org.postgresql.Driver.connect(Driver.java:280)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
我在我的postgresql-9.3-1102-jdbc41.jar
中使用Tomcat 7.0.52,PostgreSQL 9.3.15和驱动程序jar $CATALINA_BASE/lib folder
。
有人能在这里发现问题吗?