package jef.database.pooltest; import java.sql.SQLException; import java.util.concurrent.atomic.AtomicInteger; import javax.sql.DataSource; import jef.database.DbUtils; import jef.database.innerpool.IConnection; import jef.database.innerpool.IUserManagedPool; import jef.database.innerpool.PoolService; import jef.tools.ThreadUtils; import org.easyframe.enterprise.spring.TransactionMode; import org.junit.Test; /** * 测试连接池性能 * @throws SQLException */ public class ConnectionPoolV3Test { private static final int THREADS=100; private static final int LOOPS=800; @Test public void testPoolV2() throws SQLException{ DataSource ds=DbUtils.createSimpleDataSource("jdbc:derby:./db", "", ""); final IUserManagedPool pool=PoolService.getPool(ds,3, 20,TransactionMode.JPA); doTest(pool); } private void doTest(IUserManagedPool pool) throws SQLException { System.out.println("连接池初始:"+ pool.getStatus()); long start=System.currentTimeMillis(); Thread[] threads=new Thread[THREADS]; for(int i=0;i<THREADS;i++){ threads[i]=new DoThread(pool,i,start,this); } for(int i=0;i<THREADS;i++){ threads[i].start(); } while(count.get()<THREADS){ ThreadUtils.doWait(pool); System.out.println("当前连接池数量:"+ pool.getStatus()); } System.out.println("All thread finished!" + (System.currentTimeMillis()-start)+"ms"); pool.close(); } private final AtomicInteger count=new AtomicInteger(0); static class DoThread extends Thread{ private IUserManagedPool pool; private int id; private long start; private ConnectionPoolV3Test v3; public DoThread(IUserManagedPool pool, int id,long start,ConnectionPoolV3Test v3) { this.v3=v3; this.id=id; this.pool=pool; this.start=start; } @Override public void run() { for(int i=0;i<LOOPS;i++){ try { IConnection conn=pool.poll(); conn.close(); } catch (SQLException e) { e.printStackTrace(); System.out.println("thread has exception:"+id); v3.count.incrementAndGet(); ThreadUtils.doNotify(pool); return; } } // long cost=System.currentTimeMillis()-start; // System.out.println("Thread " +id+" done , cost="+cost+"ms."); v3.count.incrementAndGet(); ThreadUtils.doNotify(pool); } } }