From 2c09b80eff0499b3bdba91693b023ae4be81f5d0 Mon Sep 17 00:00:00 2001 From: lijian Date: Tue, 18 Aug 2015 15:54:35 +0800 Subject: [PATCH] =?UTF-8?q?1.=E7=B3=BB=E7=BB=9F=E8=AE=A1=E6=97=B6=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E9=97=B4(connectedTimeNano)=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=88=B0=E6=97=A5=E5=BF=97=E4=B8=AD=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E7=9A=84=E5=8F=8D=E6=98=A0=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E9=97=B4=EF=BC=88connectedTimeNano=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E6=8D=A2=E7=94=A8=EF=BC=88=E5=A2=9E=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=89=20connectedTimeMillis=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=BF=9E=E6=8E=A5=E7=9A=84=E6=97=B6=E9=97=B4?= =?UTF-8?q?=202.=E5=A4=84=E7=90=86=20mysql=208=20=E5=B0=8F=E6=97=B6?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E9=97=AE=E9=A2=98(=E5=8D=B3=E4=BD=BFtestWhil?= =?UTF-8?q?eIdle=3Dfalse,testOnBorrow=3Dfalse,testOnReturn=3Dfalse)?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E7=89=A9=E7=90=86=E8=BF=9E=E6=8E=A5=E7=9A=84?= =?UTF-8?q?=E5=B7=B2=E8=BF=9E=E6=8E=A5=E6=97=B6=E9=97=B4=E8=B6=85=E8=BF=87?= =?UTF-8?q?=20phyTimeoutMillis(=E9=BB=98=E8=AE=A47=E5=B0=8F=E6=97=B6)=20?= =?UTF-8?q?=E5=90=8E=E5=B0=B1=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD=E8=AF=A5?= =?UTF-8?q?=E7=89=A9=E7=90=86=E8=BF=9E=E6=8E=A5=203.=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=8D=95=E8=AF=8D=E6=8B=BC=E5=86=99=20destoryTask=20->=20destr?= =?UTF-8?q?oyTask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../druid/pool/DruidAbstractDataSource.java | 11 ++++++++ .../alibaba/druid/pool/DruidDataSource.java | 26 ++++++++++++++----- .../druid/pool/DruidDataSourceFactory.java | 6 +++++ .../druid/pool/DruidPooledConnection.java | 7 ++++- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 37aa44f54c..8197167758 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -97,6 +97,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements * @see #setMinEvictableIdleTimeMillis */ public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L; + public static final long DEFAULT_PHY_TIMEOUT_MILLIS = 1000L * 60L * 60L * 7; protected volatile boolean defaultAutoCommit = true; protected volatile Boolean defaultReadOnly; @@ -159,6 +160,8 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected volatile long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + protected volatile long phyTimeoutMillis = DEFAULT_PHY_TIMEOUT_MILLIS; + protected volatile boolean removeAbandoned; protected volatile long removeAbandonedTimeoutMillis = 300 * 1000; @@ -691,6 +694,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } + public long getPhyTimeoutMillis() { + return phyTimeoutMillis; + } + + public void setPhyTimeoutMillis(long phyTimeoutMillis) { + this.phyTimeoutMillis = phyTimeoutMillis; + } + public int getNumTestsPerEvictionRun() { return numTestsPerEvictionRun; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index c3aa56b61b..5363815bb0 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -138,7 +138,7 @@ public class DruidDataSource extends DruidAbstractDataSource // threads private ScheduledFuture destroySchedulerFuture; - private DestroyTask destoryTask; + private DestroyTask destroyTask; private CreateConnectionThread createConnectionThread; private DestroyConnectionThread destroyConnectionThread; @@ -684,14 +684,14 @@ public class DruidDataSource extends DruidAbstractDataSource } protected void createAndStartDestroyThread() { - destoryTask = new DestroyTask(); + destroyTask = new DestroyTask(); if (destroyScheduler != null) { long period = timeBetweenEvictionRunsMillis; if (period <= 0) { period = 1000; } - destroySchedulerFuture = destroyScheduler.scheduleAtFixedRate(destoryTask, period, period, + destroySchedulerFuture = destroyScheduler.scheduleAtFixedRate(destroyTask, period, period, TimeUnit.MILLISECONDS); initedLatch.countDown(); return; @@ -1941,7 +1941,7 @@ public class DruidDataSource extends DruidAbstractDataSource break; } - destoryTask.run(); + destroyTask.run(); } catch (InterruptedException e) { break; } @@ -2031,8 +2031,8 @@ public class DruidDataSource extends DruidAbstractDataSource StringBuilder buf = new StringBuilder(); buf.append("abandon connection, owner thread: "); buf.append(pooledConnection.getOwnerThread().getName()); - buf.append(", connected time nano: "); - buf.append(pooledConnection.getConnectedTimeNano()); + buf.append(", connected at : "); + buf.append(pooledConnection.getConnectedTimeMillis()); buf.append(", open stackTrace\n"); StackTraceElement[] trace = pooledConnection.getConnectStackTrace(); @@ -2042,6 +2042,14 @@ public class DruidDataSource extends DruidAbstractDataSource buf.append("\n"); } + buf.append("ownerThread current state is "+pooledConnection.getOwnerThread().getState() + ", current stackTrace\n"); + trace = pooledConnection.getOwnerThread().getStackTrace(); + for (int i = 0; i < trace.length; i++) { + buf.append("\tat "); + buf.append(trace[i].toString()); + buf.append("\n"); + } + LOG.error(buf.toString()); } } @@ -2118,6 +2126,12 @@ public class DruidDataSource extends DruidAbstractDataSource for (int i = 0; i < checkCount; ++i) { DruidConnectionHolder connection = connections[i]; + long phyConnectTimeMillis = connection.getTimeMillis();//physical connection connected time + if( phyConnectTimeMillis > phyTimeoutMillis ){ + evictList.add(connection);//if physical connection connected greater than phyTimeoutMillis, close the connection, for mysql 8 hours timeout + continue; + } + if (checkTime) { long idleMillis = currentTimeMillis - connection.getLastActiveTimeMillis(); if (idleMillis >= minEvictableIdleTimeMillis) { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java index 95d32ab634..6fc306f8b9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java @@ -54,6 +54,7 @@ public class DruidDataSourceFactory implements ObjectFactory { public final static String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis"; public final static String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun"; public final static String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis"; + public final static String PROP_PHY_TIMEOUT_MILLIS = "phyTimeoutMillis"; public final static String PROP_TESTWHILEIDLE = "testWhileIdle"; public final static String PROP_PASSWORD = "password"; public final static String PROP_URL = "url"; @@ -233,6 +234,11 @@ public class DruidDataSourceFactory implements ObjectFactory { dataSource.setMinEvictableIdleTimeMillis(Long.parseLong(value)); } + value = (String) properties.get(PROP_PHY_TIMEOUT_MILLIS); + if (value != null) { + dataSource.setPhyTimeoutMillis(Long.parseLong(value)); + } + value = (String) properties.get(PROP_TESTWHILEIDLE); if (value != null) { dataSource.setTestWhileIdle(Boolean.valueOf(value).booleanValue()); diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index b61fca779c..962872c896 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -65,7 +65,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. private boolean disable = false; private boolean closed = false; private final Thread ownerThread; - + private long connectedTimeMillis; private long connectedTimeNano; private volatile boolean running = false; @@ -82,6 +82,11 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. this.holder = holder; dupCloseLogEnable = holder.getDataSource().isDupCloseLogEnable(); ownerThread = Thread.currentThread(); + connectedTimeMillis = System.currentTimeMillis(); + } + + public long getConnectedTimeMillis() { + return connectedTimeMillis; } public Thread getOwnerThread() {