修正connection.close的并发问题

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@326 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-06-30 08:57:37 +00:00
parent bb581829d4
commit fce80a01ad
5 changed files with 152 additions and 10 deletions
@@ -19,7 +19,7 @@ public class StatFilterTest extends TestCase {
public void setUp() throws Exception {
JdbcStatManager.getInstance().reset();
}
public void tearDown() throws Exception {
JdbcStatManager.getInstance().reset();
}
@@ -27,7 +27,7 @@ public class StatFilterTest extends TestCase {
public void test_stat() throws Exception {
String url = "jdbc:wrap-jdbc:filters=default:jdbc:mock:xx";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1");
while (rs.next()) {
@@ -35,18 +35,22 @@ public class StatFilterTest extends TestCase {
}
rs.close();
stmt.close();
conn.close();
TabularData sqlList = JdbcStatManager.getInstance().getSqlList();
Assert.assertEquals(true, sqlList.size() > 0);
int count = 0;
for (Object item : sqlList.values()) {
CompositeData row = (CompositeData) item;
Assert.assertEquals(url, (String) row.get("URL"));
if (url.equals((String) row.get("URL"))) {
count++;
}
Assert.assertEquals(0, row.get("Count_50000_more"));
}
Assert.assertEquals(true, count > 0);
System.out.println(JSON.toJSONString(sqlList));
}
}
@@ -0,0 +1,122 @@
package com.alibaba.druid.pool.benckmark;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.NumberFormat;
import java.util.concurrent.CountDownLatch;
import javax.sql.DataSource;
import junit.framework.TestCase;
import org.apache.commons.dbcp.BasicDataSource;
import com.alibaba.druid.TestUtil;
import com.alibaba.druid.pool.DruidDataSource;
public class Oracle_Case3 extends TestCase {
private String jdbcUrl;
private String user;
private String password;
private String driverClass;
private int maxIdle = 40;
private int maxActive = 50;
private int maxWait = 5000;
private String validationQuery = "SELECT 1 FROM DUAL";
private int threadCount = 14;
private int loopCount = 3;
final int LOOP_COUNT = 100 * 1;
private boolean testOnBorrow = true;
protected void setUp() throws Exception {
jdbcUrl = "jdbc:oracle:thin:@10.20.149.85:1521:ocnauto";
user = "alibaba";
password = "ccbuauto";
driverClass = "oracle.jdbc.driver.OracleDriver";
}
public void test_0() throws Exception {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setMaxActive(maxActive);
dataSource.setMaxIdle(maxIdle);
dataSource.setMaxWait(maxWait);
dataSource.setPoolPreparedStatements(true);
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(jdbcUrl);
dataSource.setPoolPreparedStatements(true);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setValidationQuery(validationQuery);
dataSource.setTestOnBorrow(testOnBorrow);
for (int i = 0; i < loopCount; ++i) {
p0(dataSource, "druid", threadCount);
}
System.out.println();
}
public void test_1() throws Exception {
final BasicDataSource dataSource = new BasicDataSource();
dataSource.setMaxActive(maxActive);
dataSource.setMaxIdle(maxIdle);
dataSource.setMaxWait(maxWait);
dataSource.setPoolPreparedStatements(true);
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(jdbcUrl);
dataSource.setPoolPreparedStatements(true);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setValidationQuery(validationQuery);
dataSource.setTestOnBorrow(testOnBorrow);
for (int i = 0; i < loopCount; ++i) {
p0(dataSource, "dbcp", threadCount);
}
System.out.println();
}
private void p0(final DataSource dataSource, String name, int threadCount) throws Exception {
final CountDownLatch startLatch = new CountDownLatch(1);
final CountDownLatch endLatch = new CountDownLatch(1);
for (int i = 0; i < threadCount; ++i) {
Thread thread = new Thread() {
public void run() {
try {
startLatch.await();
for (int i = 0; i < LOOP_COUNT; ++i) {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL");
rs.next();
rs.close();
stmt.close();
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
endLatch.countDown();
}
};
thread.start();
}
long startMillis = System.currentTimeMillis();
long startYGC = TestUtil.getYoungGC();
long startFullGC = TestUtil.getFullGC();
startLatch.countDown();
endLatch.await();
long millis = System.currentTimeMillis() - startMillis;
long ygc = TestUtil.getYoungGC() - startYGC;
long fullGC = TestUtil.getFullGC() - startFullGC;
System.out.println("thread " + threadCount + " " + name + " millis : " + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC);
}
}