Tomcat重新启动后,所有Postgres连接都永久空闲

时间:2017-03-24 11:41:09

标签: java postgresql tomcat7 jndi

从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

有人能在这里发现问题吗?

0 个答案:

没有答案