当前位置: 首页 > 知识库问答 >
问题:

WebApp (雄猫-jdbc) 池化数据库连接引发放弃异常

漆雕伟志
2023-03-14


简而言之,在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 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秒在连接生命周期中并不算多。无论如何,问题是:< br >为了让这种联系永远存在,我还缺少什么?< br >很高兴知道:为什么我在声明连接的函数中超时,尽管它在30秒前被调用。

共有3个答案

元昊苍
2023-03-14

只需在 tomcat7 conf/server 中添加以下条目.xml或上下文中.xml您的资源标签所在的任何位置。

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
袁宜民
2023-03-14

您是否在Tomcat网站上看到了有关PoolConnection的信息。也许您需要查看属性minevictableidletimillis

为了回答您的问题,您正在超时,因为您正在检查空闲

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

抱歉,我帮不上什么忙。

唐弘和
2023-03-14

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

就我而言,在找到并阅读本文后

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

这样,您< code >设置JdbcInterceptors(...)现在应该如下所示;

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

解释-引用文章,它说;

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

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

请记住,您很可能很久以前就已经克服了这个问题,我仍然希望这有助于其他任何遇到类似问题的人,就像我一样。

干杯!

 类似资料:
  • 我们正在使用tomcat jdbc连接池与Oracle数据库。最近,我们遇到了JDBC瘦客户机的Oracle数据库中存在太多非活动会话的问题。 有人能帮我们吗?它为什么会导致数据库中的非活动会话,以及对此的解决方案是什么。

  • 主要内容:1. 导入JDBC包,2. 注册JDBC驱动程序,数据库URL配置,创建连接对象,使用具有用户名和密码的数据库URL,关闭JDBC连接安装相应的驱动程序后,现在是时候来学习使用JDBC建立数据库连接了。 建立JDBC连接所涉及的编程相当简单。 以下是基本的四个步骤 - 导入JDBC包:使用Java语言的语句在Java代码开头位置导入所需的类。 注册JDBC驱动程序:使JVM将所需的驱动程序实现加载到内存中,从而可以满足JDBC请求。 数据库URL配置:创建一个正确格式化的地址,指向要连

  • 我添加了org.apache.tomcat.jdbc.pool.PoolProperties。每次DB重新启动时,应用程序都是不可用的,因为已建立的连接仍然存在。我得到以下错误: 组织。postgresql。util。PSQLException:此连接已关闭 我试着在游泳池上使用一些其他设置,但没有效果。。。 谢谢你的帮助!

  • null 提前谢了。

  • 问题内容: 我正在尝试为我的Web应用程序配置HikariCP。我没有使用任何框架,它是一个简单的简单Java Web应用程序。当我尝试通过普通的JDBC建立连接时,它成功了,并且能够执行所有数据库操作。 但是,当我尝试与连接池建立连接时,初始化后却收到了一个我不知道的异常。 下面是我正在使用的配置,我正在上下文侦听器中对其进行初始化。我在Java 1.7上运行,带有使用HikariCP Java

  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置