数据库连接池

2. 数据库连接池

public Connection getConn() {
while ( true){
//«span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»遍历«/span»
«span style=’font-style:italic;font-family:”Courier New”;color:#8C8C8C’» «/span»for (int i = 0; i < size; i++) {
if(isConn.get(i)==0){
if (isConn.compareAndSet(i,0,1)){
return conns[i];
}
}
}
//«span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»没有空闲连接«/span», «span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»先等会«/span», «span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»让别人唤醒«/span»
«span style=’font-style:italic;font-family:”Courier New”;color:#8C8C8C’» «/span»synchronized (this){
try {
wait();//«span style=’font-style:italic;font-family: “Microsoft YaHei”;color:#8C8C8C’»此处并没有并发问题«/span», «span style=’font-style:italic; font-family:”Microsoft YaHei”;color:#8C8C8C’»但是基于语言机制«/span»,«span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»必须用«/span»synchronized«span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»才能用«/span»wait
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}

public void free(Connection conn){
for (int i = 0; i < size; i++) {
if(conns[i]==conn){
isConn.set(i,0); //«span style=’font-style:italic;font-family: “Microsoft YaHei”;color:#8C8C8C’»因为持有该线程的肯定就一个«/span», «span style=’font-style: italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»所以不需要线程安全«/span»,«span style=’font-style:italic;font-family:”Microsoft YaHei”;color:#8C8C8C’»不用«/span»cas
synchronized ( this){
notifyAll();
}
break;
}
}
}
}