我正在使用 tomcat 与 oracle 数据库的连接池。它工作正常,但是当我长时间使用我的应用程序后,它会给出错误“连接重置”。我收到此错误是因为在tomcat数据源关闭逻辑连接之前oracle服务器上的物理连接已关闭。因此,在从数据源获取连接之前,我正在使用连接对象的 isValid(0)方法检查连接有效性,如果物理连接已关闭,则该方法为false。但我不知道如何删除来自池中的无效连接对象。
答案 0 :(得分:9)
这可能是因为在数据库服务器上,超时不允许连接超过设定的时间,或者如果它没有收到说它仍然有效的信息就会死掉。解决此问题的一种方法是打开Keepalive。这些基本上ping数据库服务器,说它们仍然是有效的连接。
This是关于Tomcats DBCP配置的非常好的链接。请查看标题为“防止dB连接池泄漏”的部分。看起来这可能是一个好的开始。
答案 1 :(得分:6)
我在 server.xml 文件中配置数据源时使用了 validatationquery 。它将在提交给应用程序之前通过在数据库中执行查询来检查连接的有效性。
Oracle
validationQuery="/* select 1 from dual */"
MySql
validationQuery="/* ping */"
答案 2 :(得分:0)
如果它无效,请尝试关闭它并打开它。我的意思是你会以这种方式重新初始化它,所以你不需要将它从池中删除并重复使用它。
答案 3 :(得分:0)
如果我们想从Tomcat jdbc连接池中处理病毒java.sql.connection,
我们可以在程序中明确地这样做。 将其解包到org.apache.tomcat.jdbc.pool.PooledConnection中, setDiscarded(true)并最终关闭JDBC连接。 ConnectionPool将在返回后删除基础连接。
(ConnectionPool.returnConnection(....))
e.g。 PooledConnection pconn = conn.unwrap(PooledConnection.class); pconn.setDiscarded(真); conn.close();