package jef.database.pooltest; import java.sql.SQLException; import java.util.concurrent.atomic.AtomicInteger; import jef.database.innerpool.IConnection; import jef.database.innerpool.IUserManagedPool; import jef.tools.ThreadUtils; import junit.framework.Assert; import org.junit.Before; import org.junit.Ignore; import org.slf4j.LoggerFactory; /** * case601 * 连接池内的连接达到最大数量后,新线程获取连接将产生超时异常 * * 参数连接池大小10 线程数量11 * @author zhaolong * */ public class Conn601ExceedMax extends AbstractTestConnection{ org.slf4j.Logger log=LoggerFactory.getLogger(Conn601ExceedMax.class); private AtomicInteger countThread = new AtomicInteger(0); final AtomicInteger countException = new AtomicInteger(0); @Before public void prepare() throws SQLException { // int POOL_SIZE=10; String url = ConnDBConfigUtil.getStringValue("url"); String uname = ConnDBConfigUtil.getStringValue("uname"); String pwd = ConnDBConfigUtil.getStringValue("pwd"); int POOL_SIZE=ConnDBConfigUtil.getIntValue("pool.size"); super.prepare(url, uname, pwd, POOL_SIZE); } // @Test @Ignore public void testExceedMax() throws InterruptedException{ IUserManagedPool pool=super.getPool(); //获取线程号并且打印 int ThreadNum=ConnDBConfigUtil.getIntValue("thread.num",10); ConnPrintOutUtil.print(log, ConnPrintOutUtil.INFO, "thread.num:"+ThreadNum); //启动线程 MyThread[] threads=new MyThread[ThreadNum]; for (int j = 0; j < ThreadNum; j++) { threads[j] = new MyThread(pool, j,countThread,true); } for(int j=0;j<ThreadNum;j++){ Thread.sleep(100); threads[j].start(); } //如果所有的线程执行完 while (countThread.get() < ThreadNum) { ThreadUtils.doWait(pool); } Thread.sleep(1000); if(!ConnPrintOutUtil.isOnServer()){ Assert.assertEquals(countException.get(), 1); } if(countException.get()==1){ ConnPrintOutUtil.printSuccess(log); }else{ ConnPrintOutUtil.printFailure(log); } } class MyThread extends Thread { private IUserManagedPool pool; private int index; private boolean isRelease = true; AtomicInteger countThread = new AtomicInteger(0); public MyThread() { // TODO Auto-generated constructor stub } public MyThread(IUserManagedPool pool,int index,AtomicInteger countThread ) { // TODO Auto-generated constructor stub this.pool = pool; this.index=index; this.countThread=countThread; } public MyThread(IUserManagedPool pool,int index,AtomicInteger countThread, boolean isRelease) { // TODO Auto-generated constructor stub this(pool,index,countThread); this.isRelease = isRelease; } @Override public void run() { // TODO Auto-generated method stub try { IConnection conn=pool.poll(); Thread.sleep(20*1000); if (isRelease) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch blockx e.printStackTrace(); countException.incrementAndGet(); countThread.incrementAndGet(); ThreadUtils.doNotify(pool); ConnPrintOutUtil.print(log,ConnPrintOutUtil.INFO , "thread " + index + " has exception"); }catch(Exception e){ } countThread.incrementAndGet(); ThreadUtils.doNotify(pool); } } }