diff --git a/README b/README
index cd1c4dd564..501135c3a6 100644
--- a/README
+++ b/README
@@ -6,4 +6,13 @@ mvn install:install-file -Dfile=lib/oracle/10.2.0.2/ojdbc14_g.jar -DgroupId=com.
mvn install:install-file -Dfile=lib/oracle/10.2.0.5/ojdbc14_g.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.5 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=lib/oracle/11.2.0.3/ojdbc5_g.jar -DgroupId=com.oracle -DartifactId=ojdbc5 -Dversion=11.2.0.3 -Dpackaging=jar -DgeneratePom=true
-mvn install:install-file -Dfile=lib/oracle/11.2.0.3/ojdbc6_g.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -DgeneratePom=true
\ No newline at end of file
+mvn install:install-file -Dfile=lib/oracle/11.2.0.3/ojdbc6_g.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar -DgeneratePom=true
+
+mvn install:install-file -Dfile=lib/proxool/proxool-0.9.1.jar -DgroupId=proxool -DartifactId=proxool -Dversion=0.9.1 -Dpackaging=jar -DgeneratePom=true
+mvn install:install-file -Dfile=lib/proxool/proxool-cglib.jar -DgroupId=proxool -DartifactId=proxool-cglib -Dversion=0.9.1 -Dpackaging=jar -DgeneratePom=true
+
+mvn install:install-file -Dfile=lib/jboss/4.2.3/jboss-common.jar -DgroupId=jboss -DartifactId=jboss-common -Dversion=4.2.3 -Dpackaging=jar -DgeneratePom=true
+mvn install:install-file -Dfile=lib/jboss/4.2.3/jboss-remoting.jar -DgroupId=jboss -DartifactId=jboss-remoting -Dversion=4.2.3 -Dpackaging=jar -DgeneratePom=true
+mvn install:install-file -Dfile=lib/jboss/4.2.3/jboss-serialization.jar -DgroupId=jboss -DartifactId=jboss-serialization -Dversion=4.2.3 -Dpackaging=jar -DgeneratePom=true
+mvn install:install-file -Dfile=lib/jboss/4.2.3/jboss.jar -DgroupId=jboss -DartifactId=jboss -Dversion=4.2.3 -Dpackaging=jar -DgeneratePom=true
+mvn install:install-file -Dfile=lib/jboss/4.2.3/jboss-transaction.jar -DgroupId=jboss -DartifactId=jboss-transaction -Dversion=4.2.3 -Dpackaging=jar -DgeneratePom=true
\ No newline at end of file
diff --git a/lib/proxool/proxool-0.9.1-sources.jar b/lib/proxool/proxool-0.9.1-sources.jar
new file mode 100644
index 0000000000..a276e0d438
Binary files /dev/null and b/lib/proxool/proxool-0.9.1-sources.jar differ
diff --git a/lib/proxool/proxool-0.9.1.jar b/lib/proxool/proxool-0.9.1.jar
new file mode 100644
index 0000000000..ffb163f24e
Binary files /dev/null and b/lib/proxool/proxool-0.9.1.jar differ
diff --git a/lib/proxool/proxool-cglib.jar b/lib/proxool/proxool-cglib.jar
new file mode 100644
index 0000000000..4fe25c136d
Binary files /dev/null and b/lib/proxool/proxool-cglib.jar differ
diff --git a/pom.xml b/pom.xml
index 58ba81d759..60b16c74f9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.alibaba
druid
- 0.1.18
+ 0.1.19-SNAPSHOT
druid
@@ -54,7 +54,7 @@
http://code.alibabatech.com/wiki/display/Druid/Home
- JIRA
+ Jira
http://code.alibabatech.com/jira/browse/DRUID
@@ -278,12 +278,37 @@
0.7.1.RELEASE
test
+
+ com.jolbox
+ bonecp-benchmark
+ 0.7.1-rc2
+ test
+
+
+ com.jolbox
+ bonecp-test-commons
+ 0.7.1-rc2
+ test
+
+
+
+ proxool
+ proxool
+ 0.9.1
+ test
+
+
+ proxool
+ proxool-cglib
+ 0.9.1
+ test
+
+
c3p0
c3p0
0.9.1.2
test
-
\ No newline at end of file
diff --git a/src/test/java/com/alibaba/druid/TestForZY.java b/src/test/java/com/alibaba/druid/TestForZY.java
new file mode 100644
index 0000000000..f5efa014c3
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/TestForZY.java
@@ -0,0 +1,15 @@
+package com.alibaba.druid;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class TestForZY {
+ public void foo() throws Exception {
+ Map> m = new HashMap>();
+ }
+
+ public static class A {
+ private T value;
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/TestLinkedTransferQueue.java b/src/test/java/com/alibaba/druid/TestLinkedTransferQueue.java
new file mode 100644
index 0000000000..8b67bbfd02
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/TestLinkedTransferQueue.java
@@ -0,0 +1,28 @@
+package com.alibaba.druid;
+
+import junit.framework.TestCase;
+
+import com.alibaba.druid.util.LinkedTransferQueue;
+
+public class TestLinkedTransferQueue extends TestCase {
+
+ public void test_LinkedTransferQueue() throws Exception {
+ final LinkedTransferQueue q = new LinkedTransferQueue();
+
+ Thread thread = new Thread() {
+
+ public void run() {
+ for (;;) {
+ try {
+ q.take();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ };
+ thread.start();
+ q.put("1");
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/pool/bonecp/TestLRU.java b/src/test/java/com/alibaba/druid/pool/bonecp/TestLRU.java
new file mode 100644
index 0000000000..95ed2ba3e4
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/pool/bonecp/TestLRU.java
@@ -0,0 +1,130 @@
+package com.alibaba.druid.pool.bonecp;
+
+import java.lang.reflect.Field;
+import java.sql.Connection;
+
+import javax.sql.DataSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.logicalcobwebs.proxool.ProxoolDataSource;
+
+import com.alibaba.druid.mock.MockConnection;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.jolbox.bonecp.BoneCPDataSource;
+import com.jolbox.bonecp.ConnectionHandle;
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import com.mchange.v2.c3p0.impl.NewProxyConnection;
+
+public class TestLRU extends TestCase {
+
+ public void f_test_boneCP() throws Exception {
+ BoneCPDataSource ds = new BoneCPDataSource();
+ ds.setJdbcUrl("jdbc:mock:test");
+ ds.setPartitionCount(1);
+ ds.setMaxConnectionsPerPartition(10);
+ ds.setMinConnectionsPerPartition(0);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_druid() throws Exception {
+ DruidDataSource ds = new DruidDataSource();
+ ds.setUrl("jdbc:mock:test");
+ ds.setMaxIdle(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_dbcp() throws Exception {
+ BasicDataSource ds = new BasicDataSource();
+ ds.setUrl("jdbc:mock:test");
+ ds.setMaxIdle(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_c3p0() throws Exception {
+ ComboPooledDataSource ds = new ComboPooledDataSource();
+ ds.setJdbcUrl("jdbc:mock:test");
+ ds.setMaxPoolSize(10);
+ ds.setMinPoolSize(0);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_proxool() throws Exception {
+ ProxoolDataSource ds = new ProxoolDataSource();
+ ds.setDriver("com.alibaba.druid.mock.MockDriver");
+ ds.setDriverUrl("jdbc:mock:test");
+ ds.setMaximumConnectionCount(10);
+ ds.setMinimumConnectionCount(0);
+ ds.setUser("user");
+ ds.setPassword("password");
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+// public void test_jboss() throws Exception {
+// LocalTxDataSource ds = new LocalTxDataSource();
+// ds.setDriverClass("com.alibaba.druid.mock.MockDriver");
+// ds.setConnectionURL("jdbc:mock:test");
+// ds.setMaxSize(10);
+// ds.setMinSize(0);
+// ds.setUserName("user");
+// ds.setPassword("password");
+//
+// for (int i = 0; i < 10; ++i) {
+// f(ds, 5);
+// System.out.println("--------------------------------------------");
+// }
+// }
+
+ public static void f(DataSource ds, int count) throws Exception {
+ Connection[] connections = new Connection[count];
+ for (int i = 0; i < count; ++i) {
+ connections[i] = ds.getConnection();
+ }
+
+ for (int i = 0; i < count; ++i) {
+ System.out.println(unwrap(connections[i]).getId());
+ }
+
+ for (int i = count - 1; i >= 0; --i) {
+ connections[i].close();
+ }
+ }
+
+ public static MockConnection unwrap(Connection conn) throws Exception {
+ if (conn instanceof ConnectionHandle) {
+ ConnectionHandle handle = (ConnectionHandle) conn;
+ return (MockConnection) handle.getInternalConnection();
+ }
+ if (conn instanceof NewProxyConnection) {
+ NewProxyConnection handle = (NewProxyConnection) conn;
+
+ Field field = NewProxyConnection.class.getDeclaredField("inner");
+ field.setAccessible(true);
+ return (MockConnection) field.get(handle);
+ }
+
+ return conn.unwrap(MockConnection.class);
+ }
+
+}
diff --git a/src/test/java/com/alibaba/druid/pool/bonecp/TestPSCache.java b/src/test/java/com/alibaba/druid/pool/bonecp/TestPSCache.java
new file mode 100644
index 0000000000..886e2a2715
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/pool/bonecp/TestPSCache.java
@@ -0,0 +1,129 @@
+package com.alibaba.druid.pool.bonecp;
+
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+
+import javax.sql.DataSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.logicalcobwebs.proxool.ProxoolDataSource;
+
+import com.alibaba.druid.mock.MockConnection;
+import com.alibaba.druid.mock.MockPreparedStatement;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.jolbox.bonecp.BoneCPDataSource;
+import com.jolbox.bonecp.ConnectionHandle;
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import com.mchange.v2.c3p0.impl.NewProxyConnection;
+import com.mchange.v2.c3p0.impl.NewProxyPreparedStatement;
+
+public class TestPSCache extends TestCase {
+
+ public void test_boneCP() throws Exception {
+ BoneCPDataSource ds = new BoneCPDataSource();
+ ds.setJdbcUrl("jdbc:mock:test");
+ ds.setPartitionCount(1);
+ ds.setMaxConnectionsPerPartition(10);
+ ds.setMinConnectionsPerPartition(0);
+ ds.setPreparedStatementsCacheSize(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_druid() throws Exception {
+ DruidDataSource ds = new DruidDataSource();
+ ds.setUrl("jdbc:mock:test");
+ ds.setMaxIdle(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_dbcp() throws Exception {
+ BasicDataSource ds = new BasicDataSource();
+ ds.setUrl("jdbc:mock:test");
+ ds.setMaxIdle(10);
+ ds.setPoolPreparedStatements(true);
+ ds.setMaxOpenPreparedStatements(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_c3p0() throws Exception {
+ ComboPooledDataSource ds = new ComboPooledDataSource();
+ ds.setJdbcUrl("jdbc:mock:test");
+ ds.setMaxPoolSize(10);
+ ds.setMinPoolSize(0);
+ ds.setMaxStatements(10);
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public void f_test_proxool() throws Exception {
+ ProxoolDataSource ds = new ProxoolDataSource();
+ ds.setDriver("com.alibaba.druid.mock.MockDriver");
+ ds.setDriverUrl("jdbc:mock:test");
+ ds.setMaximumConnectionCount(10);
+ ds.setMinimumConnectionCount(0);
+ ds.setUser("user");
+ ds.setPassword("password");
+
+ for (int i = 0; i < 10; ++i) {
+ f(ds, 5);
+ System.out.println("--------------------------------------------");
+ }
+ }
+
+ public static void f(DataSource ds, int count) throws Exception {
+ Connection conn = ds.getConnection();
+
+ for (int i = 0; i < count; ++i) {
+ PreparedStatement stmt = conn.prepareStatement("SELECT 1");
+ System.out.println(System.identityHashCode(unwrap(stmt)));
+ stmt.close();
+ }
+
+ conn.close();
+ }
+
+ public static MockPreparedStatement unwrap(PreparedStatement stmt) throws Exception {
+ if (stmt instanceof NewProxyPreparedStatement) {
+ Field field = NewProxyPreparedStatement.class.getDeclaredField("inner");
+ field.setAccessible(true);
+ return (MockPreparedStatement) field.get(stmt);
+ }
+ MockPreparedStatement mockStmt = stmt.unwrap(MockPreparedStatement.class);
+ return mockStmt;
+ }
+
+ public static MockConnection unwrap(Connection conn) throws Exception {
+ if (conn instanceof ConnectionHandle) {
+ ConnectionHandle handle = (ConnectionHandle) conn;
+ return (MockConnection) handle.getInternalConnection();
+ }
+ if (conn instanceof NewProxyConnection) {
+ NewProxyConnection handle = (NewProxyConnection) conn;
+
+ Field field = NewProxyConnection.class.getDeclaredField("inner");
+ field.setAccessible(true);
+ return (MockConnection) field.get(handle);
+ }
+
+ return conn.unwrap(MockConnection.class);
+ }
+
+}