tomcat jdbc连接池的suspect、abandon操作解析
为什么80%的码农都做不了架构师?>>>
##Connection has been marked suspect
Connection has been marked suspect, possibly abandoned PooledConnection[org.postgresql.jdbc.PgConnection@c07ac94][65091 ms.]:java.lang.Exceptionat org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1102)at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:807)at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:651)at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:386)at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:87)at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:112)at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:230)at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:237)at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:214)at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52)at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1512)at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:45)at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:189)at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
##PoolCleaner tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/ConnectionPool.java
protected static class PoolCleaner extends TimerTask {protected WeakReference<ConnectionPool> pool;protected long sleepTime;PoolCleaner(ConnectionPool pool, long sleepTime) {this.pool = new WeakReference<>(pool);this.sleepTime = sleepTime;if (sleepTime <= 0) {log.warn("Database connection pool evicter thread interval is set to 0, defaulting to 30 seconds");this.sleepTime = 1000 * 30;} else if (sleepTime < 1000) {log.warn("Database connection pool evicter thread interval is set to lower than 1 second.");}}@Overridepublic void run() {ConnectionPool pool = this.pool.get();if (pool == null) {stopRunning();} else if (!pool.isClosed()) {try {if (pool.getPoolProperties().isRemoveAbandoned()|| pool.getPoolProperties().getSuspectTimeout() > 0)pool.checkAbandoned();if (pool.getPoolProperties().getMinIdle() < pool.idle.size())pool.checkIdle();if (pool.getPoolProperties().isTestWhileIdle())pool.testAllIdle();} catch (Exception x) {log.error("", x);}}}public void start() {registerCleaner(this);}public void stopRunning() {unregisterCleaner(this);}}
##checkAbandoned tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/ConnectionPool.java
/*** Iterates through all the busy connections and checks for connections that have timed out*/public void checkAbandoned() {try {if (busy.size()==0) return;Iterator<PooledConnection> locked = busy.iterator();int sto = getPoolProperties().getSuspectTimeout();while (locked.hasNext()) {PooledConnection con = locked.next();boolean setToNull = false;try {con.lock();//the con has been returned to the pool or released//ignore itif (idle.contains(con) || con.isReleased())continue;long time = con.getTimestamp();long now = System.currentTimeMillis();if (shouldAbandon() && (now - time) > con.getAbandonTimeout()) {busy.remove(con);abandon(con);setToNull = true;} else if (sto > 0 && (now - time) > (sto * 1000L)) {suspect(con);} else {//do nothing} //end if} finally {con.unlock();if (setToNull)con = null;}} //while} catch (ConcurrentModificationException e) {log.debug("checkAbandoned failed." ,e);} catch (Exception e) {log.warn("checkAbandoned failed, it will be retried.",e);}}
##suspect tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/ConnectionPool.java
/*** Thread safe way to suspect a connection. Similar to* {@link #abandon(PooledConnection)}, but instead of actually abandoning* the connection, this will log a warning and set the suspect flag on the* {@link PooledConnection} if logAbandoned=true** @param con PooledConnection*/protected void suspect(PooledConnection con) {if (con == null)return;if (con.isSuspect())return;try {con.lock();String trace = con.getStackTrace();if (getPoolProperties().isLogAbandoned()) {log.warn("Connection has been marked suspect, possibly abandoned " + con + "["+(System.currentTimeMillis()-con.getTimestamp())+" ms.]:" + trace);}if (jmxPool!=null) {jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.SUSPECT_ABANDONED_NOTIFICATION, trace);}con.setSuspect(true);} finally {con.unlock();}}
##abandon tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/ConnectionPool.java
/*** thread safe way to abandon a connection* signals a connection to be abandoned.* this will disconnect the connection, and log the stack trace if logAbandoned=true* @param con PooledConnection*/protected void abandon(PooledConnection con) {if (con == null)return;try {con.lock();String trace = con.getStackTrace();if (getPoolProperties().isLogAbandoned()) {log.warn("Connection has been abandoned " + con + ":" + trace);}if (jmxPool!=null) {jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_ABANDON, trace);}//release the connectionremoveAbandonedCount.incrementAndGet();release(con);} finally {con.unlock();}}
##release tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/ConnectionPool.java
/*** thread safe way to release a connection* @param con PooledConnection*/protected void release(PooledConnection con) {if (con == null)return;try {con.lock();if (con.release()) {//counter only decremented oncesize.addAndGet(-1);con.setHandler(null);}releasedCount.incrementAndGet();} finally {con.unlock();}// we've asynchronously reduced the number of connections// we could have threads stuck in idle.poll(timeout) that will never be// notifiedif (waitcount.get() > 0) {idle.offer(create(true));}}
tomcat-jdbc-8.5.13-sources.jar!/org/apache/tomcat/jdbc/pool/PooledConnection.java
/*** This method is called if (Now - timeCheckedIn > getReleaseTime())* This method disconnects the connection, logs an error in debug mode if it happens* then sets the {@link #released} flag to false. Any attempts to connect this cached object again* will fail per {@link #connect()}* The connection pool uses the atomic return value to decrement the pool size counter.* @return true if this is the first time this method has been called. false if this method has been called before.*/public boolean release() {try {disconnect(true);} catch (Exception x) {if (log.isDebugEnabled()) {log.debug("Unable to close SQL connection",x);}}return released.compareAndSet(false, true);}
##disconnect
/*** Disconnects the connection. All exceptions are logged using debug level.* @param finalize if set to true, a call to {@link ConnectionPool#finalize(PooledConnection)} is called.*/private void disconnect(boolean finalize) {if (isDiscarded() && connection == null) {return;}setDiscarded(true);if (connection != null) {try {parent.disconnectEvent(this, finalize);if (xaConnection == null) {connection.close();} else {xaConnection.close();}}catch (Exception ignore) {if (log.isDebugEnabled()) {log.debug("Unable to close underlying SQL connection",ignore);}}}connection = null;xaConnection = null;lastConnected = -1;if (finalize) parent.finalize(this);}
转载于:https://my.oschina.net/go4it/blog/1204375
tomcat jdbc连接池的suspect、abandon操作解析相关推荐
- 在独立Java应用程序中使用Tomcat JDBC连接池
这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按. 您可能会在文章结尾找到本书的折扣券代码,仅适用于Java Code Geeks的读者! 请享用! 在需要数据访问权限的独立Java应用程序 ...
- tomcat jdbc连接池配置属性详解之参数说明
driverClassName 数据库驱动类,针对mysql填com.mysql.jdbc.Driver username 用户名 password 密码 maxActive 最大允许的连接数 max ...
- JDBC连接池和DBUtils
本节内容: JDBC连接池 DBUtils 一.JDBC连接池 实际开发中"获得连接"或"释放资源"是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况 ...
- 数据层优化-jdbc连接池简述、druid简介
终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...
- Tomcat DBCP连接池导致的线程阻塞问题
Tomcat DBCP连接池导致的线程阻塞问题 问题描述 解决流程 问题描述 最近在测试一个多线程任务时出现了我本地项目不报错,不停止,但是刷新任何的页面或者重新加载整个网站服务都无法继续执行操作的问 ...
- HikariCP:一个叫光的JDBC连接池
简介 天不生我李淳罡,剑道万古如长夜. Hikari [hi·ka·'lē] 是日语"光"的意思.HikariCP的卖点是快.简洁.可靠,整体非常轻量,只有130Kb左右. Hik ...
- 数据库连接之jdbc连接池
BC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,s ...
- jdbc封装mysql_用Java手动封装JDBC连接池(一)
JDBC存在的问题 代码的冗余:在对数据库进行增删改查时,每个操作的JDBC流程和SQL执行代码的流程都一样,造成代码的冗余,所以我们可以把冗余的部分封装起来,封装之后,我们就不用再去写JDBC流程, ...
- JDBC、封装JDBC连接池、第三方连接池工具
主要内容: JDBC简介 JDBC来源 通过代码实现JDBC JDBC的改进需求 JDBC改进的代码实现 JDBC使用的设计模式 封装连接池 封装JDBC连接池 ThreadLoacl的使用 Thre ...
最新文章
- 详解原生AJAX请求demo(兼容IE5/6)
- luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )
- stringbuffer的最大长度_Java中的String、StringBuffer和StringBuilder
- C++对象模型1——类对象的sizeof、static成员、对象模型、this指针
- 第四十五课:MVC,MVP,MVVM的区别
- 关于小程序取data- 的值的问题
- 28,29_激活函数与GPU加速、Tanh和sigmoid、ReLU、Leaky ReLU、SELU、Softplus、GPU accelerated、案例、argmax
- python3生成随机数_python3实现随机数
- left join on 左边为主
- Ubuntu 20.04 安装 php 并配置 OpenResty
- UITextFiled和UITextView限制字数和输入特殊字符的总结
- Django-ftpserver 的两个坑
- Phodal 的 2018 节点:Think Big Be Long
- MySQL卸载教程 (Windows版)
- CentOS 7.5 安装Tomcat教程
- 7 个热门又优质的小程序 UI 组件库,社区、电商、工具各类都有!
- 英特尔携手浪潮、锐捷网络和Silicom,构建强大的IPU生态系统
- 计算机网络-CSMA/CD协议
- MySQL5.7 卸载 - Linux下卸载
- HTML如何设置幻灯片大小和位置,javascript – 动态调整skitter幻灯片图像大小