为什么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 &gt; 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操作解析相关推荐

  1. 在独立Java应用程序中使用Tomcat JDBC连接池

    这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按. 您可能会在文章结尾找到本书的折扣券代码,仅适用于Java Code Geeks的读者! 请享用! 在需要数据访问权限的独立Java应用程序 ...

  2. tomcat jdbc连接池配置属性详解之参数说明

    driverClassName 数据库驱动类,针对mysql填com.mysql.jdbc.Driver username 用户名 password 密码 maxActive 最大允许的连接数 max ...

  3. JDBC连接池和DBUtils

    本节内容: JDBC连接池 DBUtils 一.JDBC连接池 实际开发中"获得连接"或"释放资源"是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况 ...

  4. 数据层优化-jdbc连接池简述、druid简介

    终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...

  5. Tomcat DBCP连接池导致的线程阻塞问题

    Tomcat DBCP连接池导致的线程阻塞问题 问题描述 解决流程 问题描述 最近在测试一个多线程任务时出现了我本地项目不报错,不停止,但是刷新任何的页面或者重新加载整个网站服务都无法继续执行操作的问 ...

  6. HikariCP:一个叫光的JDBC连接池

    简介 天不生我李淳罡,剑道万古如长夜. Hikari [hi·ka·'lē] 是日语"光"的意思.HikariCP的卖点是快.简洁.可靠,整体非常轻量,只有130Kb左右. Hik ...

  7. 数据库连接之jdbc连接池

    BC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,s ...

  8. jdbc封装mysql_用Java手动封装JDBC连接池(一)

    JDBC存在的问题 代码的冗余:在对数据库进行增删改查时,每个操作的JDBC流程和SQL执行代码的流程都一样,造成代码的冗余,所以我们可以把冗余的部分封装起来,封装之后,我们就不用再去写JDBC流程, ...

  9. JDBC、封装JDBC连接池、第三方连接池工具

    主要内容: JDBC简介 JDBC来源 通过代码实现JDBC JDBC的改进需求 JDBC改进的代码实现 JDBC使用的设计模式 封装连接池 封装JDBC连接池 ThreadLoacl的使用 Thre ...

最新文章

  1. EditText 空指针问题
  2. amap vueamap 与_在vue中使用高德地图vue-amap
  3. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数
  4. python 进程池_Python实践17-进程池
  5. css3实现的一些灰色的导航条按钮
  6. php5.2 json,php5.2以上版本json_encode兼容性
  7. 使用jQuery Mobile设计移动设备网站
  8. spring与struts2 mvc共存web.xml简单配置
  9. 【美赛】美赛字体格式和排版要求
  10. TFTP服务器的搭建与使用
  11. c语言无法打开源文件stdafx.h,VS2013/2012/2010 下无法打开 源 文件“stdafx.h”的解决方法...
  12. 生命的编码-业余玩家怎么读懂AlphaFold的重要意义
  13. 微信公众号里面服务器配置关闭,微信公众号服务器配置无法修改
  14. iOS 怎么查app的下载量
  15. HDU-6441-Find Integer(费马大定理+勾股数)
  16. 深度解析NRF24L01
  17. 如何快速下载Google play里软件APK
  18. IDM下载神器全新详解教程:如何安装以及不限速下载某网盘资源
  19. 如何通过自动下载使PlayStation 4(和游戏)保持最新
  20. 【3d建模】零基础入门要学的这些中模阶段、高模阶段、低模阶段和贴图

热门文章

  1. RSS Reader in PC iPhone
  2. 本地化Microsoft ReportViewer
  3. R_数据正态分布检验
  4. (8)Microsoft office Word 2013版本操作入门_制作传单海报
  5. 笔记本wifi与台式机、内网服务器共网、共享wifi详细教程
  6. python多核并行计算_Python 多核并行计算
  7. 基于RFID技术的电力计能表仓储管理系统—铨顺宏
  8. 用过的最好的自动机画图工具  JFLAP
  9. 详解Unicode和JavaScript字符编码
  10. DolphinScheduler 之Docker 部署