问题 如何从池中删除无效的数据库连接


我正在使用连接池 tomcat的 同 神谕 数据库。它工作正常,但是当我在很长一段时间后使用我的应用程序时它会给出“连接重置“。我收到此错误是因为在tomcat数据源关闭逻辑连接之前oracle服务器上的物理连接已关闭。所以在从数据源获取连接之前,我正在检查连接的有效性 的isValid(0) 连接对象的方法,如果物理连接关闭则给出错误。但我不知道该怎么做 去掉 那 连接无效 池中的物体。


9878
2018-05-17 12:05


起源



答案:


这可能是因为在数据库服务器上,超时不允许连接超过设定时间,或者如果它没有收到说它仍然有效的信息就会死掉。解决此问题的一种方法是打开Keepalive。这些基本上ping数据库服务器,说它们仍然是有效的连接。

这个 是Tomcats DBCP配置上非常好的链接。请查看标题为“防止dB连接池泄漏”的部分。看起来这可能是一个好的起点。


9
2018-05-17 12:42



isValid(10)不工作;有什么建议么 - Dyapa Srikanth
是的,我之前遇到过这种情况。您可以配置连接池以在指定的时间间隔内使用SQL查询(validationQuery)检查死连接。这是DBCP配置的一部分。您希望避免检入代码,因为您的代码应该不知道池或特定数据库。 - cjstehno
我已经配置了它,但是当我调用con.isValid()时它没有给出任何东西。 - Dyapa Srikanth
@cjstehno是的我同意。您不应该在代码中检查池中连接的状态。你使用什么类型的游泳池? - John Kane
您可能不想发布您的dbs:url,用户名和密码。您可能希望编辑注释或在服务器上更改注释。 - John Kane


答案:


这可能是因为在数据库服务器上,超时不允许连接超过设定时间,或者如果它没有收到说它仍然有效的信息就会死掉。解决此问题的一种方法是打开Keepalive。这些基本上ping数据库服务器,说它们仍然是有效的连接。

这个 是Tomcats DBCP配置上非常好的链接。请查看标题为“防止dB连接池泄漏”的部分。看起来这可能是一个好的起点。


9
2018-05-17 12:42



isValid(10)不工作;有什么建议么 - Dyapa Srikanth
是的,我之前遇到过这种情况。您可以配置连接池以在指定的时间间隔内使用SQL查询(validationQuery)检查死连接。这是DBCP配置的一部分。您希望避免检入代码,因为您的代码应该不知道池或特定数据库。 - cjstehno
我已经配置了它,但是当我调用con.isValid()时它没有给出任何东西。 - Dyapa Srikanth
@cjstehno是的我同意。您不应该在代码中检查池中连接的状态。你使用什么类型的游泳池? - John Kane
您可能不想发布您的dbs:url,用户名和密码。您可能希望编辑注释或在服务器上更改注释。 - John Kane


我用了 validatationquery 在配置数据源时 server.xml中 文件。它将在给予应用程序之前通过在数据库中执行查询来检查连接的有效性。

对于 神谕

validationQuery="/* select 1 from dual */"

对于 MySQL的

validationQuery="/* ping */"

6
2018-06-22 05:19





如果它无效,请尝试关闭它并打开它。我的意思是你会以这种方式重新初始化它,所以你不需要将它从池中删除并重用它。


0
2018-05-17 12:10



if(!con.isValid(30)){con.close(); con = ds.getConnection(); 谁知道第二个是否有效。 - Dyapa Srikanth
con = ds.getConnection(); if(!con.isValid(30))con = ds.getConnection();返回;如果我这样做,我将从池中获得一个新连接,我将这个新连接返回到调用地点,该功能在使用后关闭连接。在这里,我没有返回无效连接,以便在一段时间之后放弃我在池配置文件(server.xml / context.xml)中配置的内容 - Dyapa Srikanth


如果我们想从Tomcat jdbc连接池中处理一个生病的java.sql.connection,

我们可以在程序中明确地这样做。 将其解包到org.apache.tomcat.jdbc.pool.PooledConnection中, setDiscarded(true)并最终关闭JDBC连接。 ConnectionPool将在返回后删除基础连接。

(ConnectionPool.returnConnection(....))

例如 PooledConnection pconn = conn.unwrap(PooledConnection.class); pconn.setDiscarded(真); conn.close();


0
2017-12-15 04:22