Web应用程序(Tomcat的JDBC)汇集DB连接抛出异常抛弃(WebApp (Tomcat-jd

2019-07-03 10:44发布

我一直这么浏览了一段时间,和嚼我的帽子的过程中,却找不到完全匹配我的问题。
对于短,我越来越不活跃,这是一对夫妇服务器端线程的正常行为的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)

我PoolProperties配置如下:

    PoolProperties pp = new PoolProperties();

    pp.setUrl( someValidUrl);
    pp.setDriverClassName("com.mysql.jdbc.Driver");
    pp.setUsername( someUser);
    pp.setPassword( somePassword);
    pp.setJmxEnabled( true);
    pp.setTestWhileIdle( true);
    pp.setTestOnBorrow( true);
    pp.setValidationQuery( "SELECT 1");
    pp.setTestOnReturn( false);
    pp.setValidationInterval(30000);
    pp.setTimeBetweenEvictionRunsMillis(30000);
    pp.setMaxActive(100);
    pp.setInitialSize(10);
    pp.setMaxWait(10000);
    pp.setMinEvictableIdleTimeMillis(30000);
    pp.setMinIdle(10);

    pp.setLogAbandoned(true);
    pp.setRemoveAbandoned(true);
    pp.setRemoveAbandonedTimeout(60);
    pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
      "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");    

    setPoolProperties(pp);

我希望setValidationInterval(30000)会救我,因为30岁是不是在连接的生命周期多。 但无论如何,问题是:
我缺少保持这个连接永远活着?
一个很好的知道:为什么我超时在声称的连接功能,虽然它在30秒之前调用。

Answer 1:

虽然我在1年以上,在后期通过这个网页来了,但我偶然在这里因为我正经历着类似的问题和需要解决的了。 所以,我想我会分享什么最终为我工作。

在我的情况,发现并通过这篇文章阅读>>>后配置-JDBC池,高并发 -我只是说像这样我的池配置的拦截器;

"org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"

使线路(从您发布上面的代码),您做setJdbcInterceptors(...)现在应该如下所示;

p.setJdbcInterceptors(
            "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
            + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;"
            + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");

说明 -从文章引用,它说;

我们要确保当我们检测到仍在使用的连接,我们将重置超时定时器,以便连接不会被视为放弃。 我们通过插入一个拦截器做到这一点。

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

记住,你很可能已经克服了这个问题很久以前轴承,我还是希望这有助于其他具有碰到这个页面类似的问题,就像我做了任何人。

干杯!



Answer 2:

你有没有看到有关Tomcat的网站上的信息PoolConnection 。 也许你需要的是看物业minEvictableIdleTimeMillis

要回答你的问题,你超时,因为要检查的闲置与放弃每30秒(见连接TimeBetweenEvictionRunsMillis )因为你在30秒的设定的evictable空闲超时(见minEvictableIdleTimeMillis ),那么你最终得到你所拥有的。 你说在空闲时,我怀疑异常是关闭空闲连接,而不是放弃的连接的结果您收到此异常。 从我的理解放弃一个连接用于超过预期的查询超时长(相对于空闲连接)。

我个人不希望有活动连接永远,因为他们会消耗资源(也就是数据库的连接)不必要的。 我想玩弄我的最大连接数,驱逐运行和空闲时间来优化我自己的要求。 我想你可以够设置这些值大,几乎可以说是永远的! 它真的取决于你在做什么,但...

对不起,我不能更多的帮助在这里。



Answer 3:

只需添加下面的条目tomcat7的conf / server.xml中或在context.xml中无论你的资源标签存在。

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


Answer 4:

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



Answer 5:

如果您在Tomcat中的context.xml中定义数据源,那么你应该添加ResetAbandonedTimer象下面这样:

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer"

设置ResetAbandonedTimer后,问题在我的应用得到了解决,请求你让我知道是有ResetAbandonedTimer拦截和removeAbandoned =“真” removeAbandonedTimeout =“60”之间的关系



Answer 6:

这个问题的答案是对我很有帮助。

虽然在我的情况,我已经有“ResetAbandonedTimer” JDBC拦截配置。

不过,我有这样的跑了比“removeAbandonedTimeout”那我也不再配置的查询。 有一次,我增加了“removeAbandonedTimeout”的问题就走了。



Answer 7:

也有类似的问题,即,Tomcat的关闭了JDBC连接,由于它变得放弃了,因为一个事务,需要很长的时间。

通过认识到解决它abandonedidle :是不同的,通过设置spring.datasource.tomcat.removeAbandonedTimeout: 86400 #seconds



文章来源: WebApp (Tomcat-jdbc) Pooled DB connection throwing abandon exception