Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从池中删除无效的数据库连接_Java_Oracle_Tomcat_Connection Pooling - Fatal编程技术网

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

Java 如何从池中删除无效的数据库连接,java,oracle,tomcat,connection-pooling,Java,Oracle,Tomcat,Connection Pooling,我正在使用tomcat与oracle数据库的连接池。它工作正常,但当我在很长时间后使用应用程序时,会出现错误“连接重置”。我之所以出现此错误,是因为oracle服务器上的物理连接在tomcat数据源上的逻辑连接关闭之前关闭。因此,在从数据源获取连接之前,我正在使用连接对象的isValid(0)方法检查连接有效性,如果物理连接关闭,该方法将给出false。但是我不知道如何从池中删除无效连接对象。如果无效,请尝试关闭它并打开它。我的意思是,你可以用这种方式重新初始化它,这样你就不需要将它从池中删除并

我正在使用tomcatoracle数据库的连接池。它工作正常,但当我在很长时间后使用应用程序时,会出现错误“连接重置”。我之所以出现此错误,是因为oracle服务器上的物理连接在tomcat数据源上的逻辑连接关闭之前关闭。因此,在从数据源获取连接之前,我正在使用连接对象的isValid(0)方法检查连接有效性,如果物理连接关闭,该方法将给出false。但是我不知道如何从池中删除无效连接对象。

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

这可能是因为在db服务器上,存在一个超时,不允许连接超过设置的时间,或者如果它没有接收到表示它仍然有效的内容,它就会死亡。解决此问题的一种方法是打开keepalives。这些基本上是ping数据库服务器,表示它们仍然是有效的连接


在Tomcats DBCP配置上是一个非常好的链接。请看标题为“防止数据库连接池泄漏”的部分。这似乎是一个很好的起点。

我在server.xml文件中配置数据源时使用了验证查询。它将通过在数据库中执行查询来检查连接的有效性,然后再提交给应用程序

对于Oracle

validationQuery="/* select 1 from dual */"
对于MySql

validationQuery="/* ping */"

如果我们想从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(真);
康涅狄格州关闭()

如果(!con.isValid(30)){con.close();con=ds.getConnection();}谁知道第二个是否有效;如果(!con.isValid(30))con=ds.getConnection();返回con;如果我这样做,我将从池中获得一个新连接,并将此新连接返回到调用位置,该函数将在使用后关闭连接。在这里,我并没有返回无效的连接,所以在我在池配置文件(server.xml/context.xml)中配置的内容(是的,我以前遇到过)一段时间后,它就放弃了。您可以将连接池配置为在指定的时间间隔内使用SQL查询(validationQuery)检查死连接。这是DBCP配置的一部分。您希望避免签入代码,因为您的代码应该不知道池或特定数据库。我已经配置了它,但当我调用con.isValid()时,它没有给出任何东西。@cjsethno是的,我同意。您不应该在代码中检查池中连接的状态。您正在使用什么类型的池?公共静态连接getConnection(){Connection con=null;尝试{if(ds==null)loadDataSource();con=ds.getConnection();}捕获(异常e){e.printStackTrace();抛出新的DBUtilException(无法获取数据库连接对象。原因:“+e.getMessage());}return con;}我需要做什么。您可能不想发布您的dbs:url、用户名和密码。您可能想编辑您的评论或在服务器上更改它。