From ca206d47bde8b74127188d62e0538471e674459e Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 22 May 2011 14:23:41 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3DruidDataSource=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@190 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../alibaba/druid/pool/ConnectionHolder.java | 15 +++++++++-- .../alibaba/druid/pool/DruidDataSource.java | 25 ++++++------------- .../pool/ui/DruidDataSourceUIManager.java | 17 ++++++++++++- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java index 4b37d674eb..69a115552d 100644 --- a/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java @@ -34,7 +34,8 @@ public final class ConnectionHolder { private final Connection conn; private final List connectionEventListeners = new CopyOnWriteArrayList(); private final List statementEventListeners = new CopyOnWriteArrayList(); - private final long timeMillis = System.currentTimeMillis(); + private final long connecttimeMillis; + private long lastActiveMillis; private long useCount = 0; private final boolean poolPreparedStatements; @@ -46,6 +47,8 @@ public final class ConnectionHolder { this.dataSource = dataSource; this.conn = conn; this.poolPreparedStatements = dataSource.isPoolPreparedStatements(); + this.connecttimeMillis = System.currentTimeMillis(); + this.lastActiveMillis = connecttimeMillis; if (this.poolPreparedStatements) { statementPool = new PreparedStatementPool(); @@ -54,6 +57,14 @@ public final class ConnectionHolder { } } + public long getLastActiveMillis() { + return lastActiveMillis; + } + + public void setLastActiveMillis(long lastActiveMillis) { + this.lastActiveMillis = lastActiveMillis; + } + public void addTrace(PoolableStatement stmt) { statementTrace.add(stmt); } @@ -87,7 +98,7 @@ public final class ConnectionHolder { } public long getTimeMillis() { - return timeMillis; + return connecttimeMillis; } public long getUseCount() { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 97ea9e1ae2..e0cd18b168 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -50,7 +50,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private final Condition notEmpty = lock.newCondition(); private final Condition notMaxActive = lock.newCondition(); private final Condition lowWater = lock.newCondition(); - private final Condition highWater = lock.newCondition(); private final Condition idleTimeout = lock.newCondition(); // stats @@ -393,12 +392,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat throw new NullPointerException(); } + e.setLastActiveMillis(System.currentTimeMillis()); connections[count++] = e; - if (count == maxIdle + 1) { - highWater.signal(); - } - notEmpty.signal(); } @@ -550,7 +546,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat public void run() { initedLatch.countDown(); - final long highWaterWaitTime = 1000; for (;;) { // 从前面开始删除 try { @@ -562,25 +557,21 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat break; } + if (count <= 0) { + Thread.sleep(minEvictableIdleTimeMillis); + continue; + } + ConnectionHolder first = null; lock.lock(); try { - if (count <= 0) { - continue; - } - - if (count <= minIdle) { - highWater.await(highWaterWaitTime, TimeUnit.MILLISECONDS); - continue; - } - first = connections[0]; if (first == null) { continue; } - long millis = System.currentTimeMillis() - first.getTimeMillis(); + long millis = System.currentTimeMillis() - first.getLastActiveMillis(); if (millis < minEvictableIdleTimeMillis) { idleTimeout.await(millis, TimeUnit.MILLISECONDS); continue; @@ -588,7 +579,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat // removete first System.arraycopy(connections, 1, connections, 0, count - 1); - connections[count - 1] = null; + connections[--count] = null; } finally { lock.unlock(); } diff --git a/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java b/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java index 3d6706e8ab..6edf3ba20f 100644 --- a/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java +++ b/src/test/java/com/alibaba/druid/pool/ui/DruidDataSourceUIManager.java @@ -74,6 +74,9 @@ public class DruidDataSourceUIManager extends JFrame { private JLabel lbConnecting = new JLabel("Connecting : "); private JTextField txtConnecting = new JTextField("0"); + + private JLabel lbValidationQuery = new JLabel("ValidationQuery : "); + private JTextField txtValidationQuery = new JTextField(""); private AtomicInteger connectingCount = new AtomicInteger(); @@ -228,11 +231,23 @@ public class DruidDataSourceUIManager extends JFrame { layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMinEvictableIdleTimeMillis, 0, SpringLayout.VERTICAL_CENTER, lbMinEvictableIdleTimeMillis); layout.putConstraint(SpringLayout.WEST, txtMinEvictableIdleTimeMillis, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMinEvictableIdleTimeMillis, 0, SpringLayout.EAST, txtUrl); + + // //// + + mainPanel.add(lbValidationQuery); + layout.putConstraint(SpringLayout.NORTH, lbValidationQuery, 10, SpringLayout.SOUTH, lbMinEvictableIdleTimeMillis); + layout.putConstraint(SpringLayout.WEST, lbValidationQuery, 0, SpringLayout.WEST, lbUrl); + layout.putConstraint(SpringLayout.EAST, lbValidationQuery, 0, SpringLayout.EAST, lbUrl); + + mainPanel.add(txtValidationQuery); + layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtValidationQuery, 0, SpringLayout.VERTICAL_CENTER, lbValidationQuery); + layout.putConstraint(SpringLayout.WEST, txtValidationQuery, 0, SpringLayout.WEST, txtUrl); + layout.putConstraint(SpringLayout.EAST, txtValidationQuery, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(btnInitDataSource); - layout.putConstraint(SpringLayout.NORTH, btnInitDataSource, 10, SpringLayout.SOUTH, lbMinEvictableIdleTimeMillis); + layout.putConstraint(SpringLayout.NORTH, btnInitDataSource, 10, SpringLayout.SOUTH, lbValidationQuery); layout.putConstraint(SpringLayout.WEST, btnInitDataSource, 0, SpringLayout.WEST, lbUrl); btnInitDataSource.addActionListener(new ActionListener() {