From a12729573deeed51afb8cce27ee08cb44bb84163 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 27 May 2011 14:39:10 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AEDriver?= 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@205 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../druid/pool/DruidAbstractDataSource.java | 8 +++ .../alibaba/druid/pool/DruidDataSource.java | 32 ++++++---- .../com/alibaba/druid/bvt/pool/Case0.java | 60 +++++++++++++++++++ 3 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/Case0.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 1bf0317899..c7abf46c2d 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -594,6 +594,10 @@ public abstract class DruidAbstractDataSource implements DataSource, DataSourceP public Driver getDriver() { return driver; } + + public void setDriver(Driver driver) { + this.driver = driver; + } @Override public List getFilters() { @@ -715,6 +719,10 @@ public abstract class DruidAbstractDataSource implements DataSource, DataSourceP conn = new FilterChainImpl(dataSource).connection_connect(info); } else { conn = dataSource.getDriver().connect(url, info); + + if (conn == null) { + throw new SQLException("connect error, url " + url); + } } conn.setAutoCommit(dataSource.isDefaultAutoCommit()); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index e0cd18b168..6644cebee6 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -106,22 +106,28 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.jdbcUrl = this.jdbcUrl.trim(); } - if (this.driverClass == null || this.driverClass.isEmpty()) { - this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl); - } + if (this.driver == null) { + if (this.driverClass == null || this.driverClass.isEmpty()) { + this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl); + } + try { + driver = (Driver) Class.forName(this.driverClass).newInstance(); + } catch (IllegalAccessException e) { + throw new SQLException(e.getMessage(), e); + } catch (InstantiationException e) { + throw new SQLException(e.getMessage(), e); + } catch (ClassNotFoundException e) { + throw new SQLException(e.getMessage(), e); + } + } else { + if (this.driverClass == null) { + this.driverClass = driver.getClass().getName(); + } + } + this.dbType = JdbcUtils.getDbType(jdbcUrl, driverClass.getClass().getName()); - try { - driver = (Driver) Class.forName(this.driverClass).newInstance(); - } catch (IllegalAccessException e) { - throw new SQLException(e.getMessage(), e); - } catch (InstantiationException e) { - throw new SQLException(e.getMessage(), e); - } catch (ClassNotFoundException e) { - throw new SQLException(e.getMessage(), e); - } - for (Filter filter : filters) { filter.init(this); } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/Case0.java b/src/test/java/com/alibaba/druid/bvt/pool/Case0.java new file mode 100644 index 0000000000..55658c9739 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/Case0.java @@ -0,0 +1,60 @@ +package com.alibaba.druid.bvt.pool; + +import java.sql.Connection; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.pool.DruidDataSource; + +public class Case0 extends TestCase { + + public void test_0() throws Exception { + final DruidDataSource dataSource = new DruidDataSource(); + + dataSource.setDriver(new MockDriver() { + + }); + dataSource.setUrl("jdbc:mock:"); + + dataSource.setMinIdle(0); + dataSource.setMaxActive(2); + dataSource.setMaxIdle(2); + + Connection conn1 = dataSource.getConnection(); + Connection conn2 = dataSource.getConnection(); + + final CountDownLatch startLatch = new CountDownLatch(1); + final CountDownLatch completeLatch = new CountDownLatch(1); + final AtomicInteger waitCount = new AtomicInteger(); + Thread t = new Thread() { + public void run() { + try { + startLatch.countDown(); + waitCount.incrementAndGet(); + Connection conn = dataSource.getConnection(); + waitCount.decrementAndGet(); + conn.close(); + + completeLatch.countDown(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }; + t.start(); + + startLatch.await(); + Assert.assertFalse(completeLatch.await(1, TimeUnit.SECONDS)); + conn1.close(); + Assert.assertTrue(completeLatch.await(1, TimeUnit.SECONDS)); + conn2.close(); + Assert.assertTrue(completeLatch.await(1, TimeUnit.SECONDS)); + + dataSource.close(); + } +}