简而言之,在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秒前被调用。
只需在 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"
您是否在Tomcat网站上看到了有关PoolConnection的信息。也许您需要查看属性minevictableidletimillis
为了回答您的问题,您正在超时,因为您正在检查空闲
就我个人而言,我不想让连接永远活着,因为它们会不必要地消耗资源(即与数据库的连接)。我会玩弄我的最大连接、驱逐运行和空闲时间来优化我自己的需求。我想你可以将这些值设置得足够大,几乎是永远的!不过,这确实取决于你在做什么…
抱歉,我帮不上什么忙。
尽管我迟了一年才来到这个页面,但我在这里遇到了同样的问题,也需要一个解决方案。所以我想我会分享最终对我有用的东西。
就我而言,在找到并阅读本文后
"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在使用后不释放连接的原因可能是什么? 这是我的配置