package jef.database.pooltest;
import java.sql.SQLException;
import jef.database.innerpool.IConnection;
import jef.database.innerpool.IUserManagedPool;
import org.junit.Before;
import org.junit.Ignore;
/**
* case609
* 测试线程池释放连接的时候是否会产生空指针的问题
* 此case需要debug场景模拟
* 1.在AbstractConnectionPool的线程的for循环外设置断点
* 2.在ConnectionPoolV2的release关闭方法置空之前设置断点
* 让每个连接拿到线程休眠,确保在release之前确保已经进入checker线程的断点
* 让release线程跳转到置空的位置先不置空 打印出要release的连接的hashCode
* 进入checker线程一直跳转到判断为空跳过的下一步
* 让release线程置空
* 让checker线程往下走 则会模拟出线程不同步的空指针异常
*
* 建议要使测试线程的休眠时间要比checker线程休眠的时间要长
* 但是checker线程的休眠时间不能太短 要等到线程池满了之后再测试
* 因为要保证checker线程拿到迭代器是没有释放的
* 虽然通过debug手段可以控制线程时间的顺序
*
* @author zhaolong
*
*/
public class Conn609ReleaseNullTest extends AbstractTestConnection{
@Before
public void prepare()
throws SQLException {
// TODO Auto-generated method stub
String url = ConnDBConfigUtil.getStringValue("url");
String uname = ConnDBConfigUtil.getStringValue("uname");
String pwd = ConnDBConfigUtil.getStringValue("pwd");
int POOL_SIZE=10;
super.prepare(url, uname, pwd, POOL_SIZE);
}
// public static void main(String[] args) {
// MyThread[] threads=new MyThread[10];
// Iterator<MyThread> its=new ArrayIterator<MyThread>(threads);
// while(its.hasNext()){
// MyThread t=its.next();
// for(int i=0;i<10;i++){
// if(t==threads[i]){
// System.out.println("yes");
// return ;
// }
// }
// }
//
// }
// @Test
@Ignore
public void testCheckerWork() throws SQLException, InterruptedException{
IUserManagedPool pool=super.getPool();
MyThread[] threads=new MyThread[10];
for(int i=0;i<10;i++){
threads[i]=new MyThread(pool);
threads[i].start();
}
//防止主线程结束
Thread.sleep(15*60*1000);
}
class MyThread extends Thread {
private IUserManagedPool pool;
public MyThread() {
// TODO Auto-generated constructor stub
}
public MyThread(IUserManagedPool pool) {
// TODO Auto-generated constructor stub
this.pool = pool;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
IConnection conn=pool.poll();
//休眠等待断开
Thread.sleep(10*1000);
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch blockx
e.printStackTrace();
}
}
}
}