Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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 WebApp(Tomcat jdbc)池数据库连接引发放弃异常_Java_Mysql_Tomcat_Connection Pooling - Fatal编程技术网

Java WebApp(Tomcat jdbc)池数据库连接引发放弃异常

Java WebApp(Tomcat jdbc)池数据库连接引发放弃异常,java,mysql,tomcat,connection-pooling,Java,Mysql,Tomcat,Connection Pooling,我浏览SO已有一段时间了,在浏览过程中我一直在嚼帽子,但找不到与我的问题完全匹配的东西。 简言之,在60秒的不活动后,我得到了极好的堆栈跟踪(org.apache.tomcat.jdbc.pool.ConnectionPool放弃),这是两个服务器端线程的正常行为。 我直接使用Tomcat JDBC连接池(org.apache.Tomcat.JDBC.pool.DataSource) 堆栈跟踪: Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.poo

我浏览SO已有一段时间了,在浏览过程中我一直在嚼帽子,但找不到与我的问题完全匹配的东西。
简言之,在60秒的不活动后,我得到了极好的堆栈跟踪(org.apache.tomcat.jdbc.pool.ConnectionPool放弃),这是两个服务器端线程的正常行为。
我直接使用Tomcat JDBC连接池(org.apache.Tomcat.JDBC.pool.DataSource)
堆栈跟踪:

Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon WARNING: Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) at com.getsom.getConnection(DAO.java:1444) at com.getsom.PreparedConnection.(PreparedConnection.java:48) at com.getsom.Alarms.run(Alarms.java:492) 我希望setValidationInterval(30000)能拯救我,因为30秒在连接生命周期中并不多。无论如何,问题是:
我错过了什么才能让这个连接永远保持活力?

一个好消息:为什么我在声明连接的函数中超时了,尽管它是在30秒之前调用的。

你有没有看到Tomcat网站上关于连接的信息。也许您需要查看属性
minevictableidletimellis

为了回答您的问题,您正在超时,因为您每30秒检查一次空闲和放弃连接(请参阅
timebetweenvictionrunsmillis
),并且由于您将可收回的空闲超时设置为30秒(请参阅
minevictableidletimillis
),那么您就得到了您所拥有的。您说过您在空闲时收到此异常,我怀疑此异常是由于关闭空闲连接而不是放弃连接造成的。据我所知,放弃连接用于超时超过预期的查询(与空闲连接相反)

就我个人而言,我不希望连接永远活着,因为它们会不必要地消耗资源(即与数据库的连接)。我会玩我的最大连接,驱逐运行和空闲时间,以优化我自己的需求。我想您可以将这些值设置得足够大,几乎可以是永久的!但这确实取决于你在做什么


很抱歉,我在这里帮不上什么忙。

尽管我迟了一年才来到这个页面,但我在这里遇到了一些问题,因为我也遇到了类似的问题,需要解决。所以我想我会分享最终对我有用的东西

在我的例子中,在找到并阅读了这篇文章之后>>>——我只是在我的池配置中添加了一个类似的拦截器

"org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
因此,您使用
setjdbinterceptors(…)
的行(来自上面发布的代码)现在应该如下所示:

p.setJdbcInterceptors(
            "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
            + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;"
            + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");
解释——引用文章中的话,它说

我们希望确保,当我们检测到连接仍在使用时,我们会重置超时计时器,这样连接就不会被视为已放弃。我们通过插入一个拦截器来实现这一点

每次准备语句或执行查询时,计时器都会重置连接池上的放弃计时器。这边执行大量查询和更新不会超时

请记住,您很可能很久以前就解决了这个问题,我仍然希望这能帮助其他遇到类似问题的人,就像我一样


干杯

在配置文件中跟踪“RemoveBandonedTimeout”。这应该是应用程序中的最大运行查询。它将在执行过程中关闭连接

只需在ToMCAT7 CONF/Serv.xml或在CordEx.xml中添加以下条目,无论您的资源标签存在哪里。

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"

如果您在tomcat的context.xml中定义了数据源,那么您应该添加ResetForwardedTimer,如下所示:

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer"

设置ResetForwardedTimer后,问题在我的应用程序中得到解决,请您告诉我ResetForwardedTimer拦截器和RemoveBandoned=“true”RemoveBandonedTimeout=“60”之间是否存在任何关系此问题的答案对我很有帮助

虽然在我的例子中,我已经配置了“resetaboutedtimer”JDBC拦截器


但是,我有一个查询的运行时间比我配置的“RemoveBandonedTimeout”要长。一旦我增加了“RemoveBandonedTimeout”,问题就消失了。

有一个类似的问题,即tomcat正在关闭JDBC连接,因为它因为事务花费了很长时间而被放弃


解决方法是意识到废弃的和空闲的不同,并设置:
spring.datasource.tomcat.removeAbandonedTimeout:86400秒
我可以看到这个线程是旧的,但我有一个类似的问题,我最终找到了导致它的原因,因此,我想与大家分享一下它是否能帮助某些人:

我使用了来自restful web服务的连接。在服务器端处理客户端请求的接口中,我意外地在方法签名中添加了“throws IOException”:

@GET
@Path("/databases")
@Produces(MediaType.APPLICATION_JSON)
public String getAllDatabases() throws IOException {

是的,我已经广泛阅读了这篇文章。我认为这与遗弃有关,而不是驱逐。我的假设是ConnectionPool将保持这些连接的活动状态。您在执行查询时是否收到错误?您的查询运行时间超过60秒,这似乎很奇怪!不。有问题的线程是空闲的。这就是问题所在,因为ConnectionPool假设连接已被放弃。如果“已放弃”连接而不是“空闲”连接有问题,请尝试设置(我已解决问题):spring.datasource.tomcat.removeAbandonedTimeout:86400#second我也有同样的问题,并且已经设置了removeAbandonedTimeout,但没有帮助,不幸的是,您能解释一下如何在Tomcat中“跟踪”该资源属性吗?警告:只有当您对一个连接只执行一次查询,然后再次关闭它时,或者当使用ResetForwardedTimer筛选器时,这才是正确的。否则,批处理操作可能会在超时时运行。这也是我的解决方案!谢谢你们!
@GET
@Path("/databases")
@Produces(MediaType.APPLICATION_JSON)
public String getAllDatabases() throws IOException {