经常使用hibernate,在使用hibernate的时候经常使用到DBCP和C3P0的连接池,某天自己突然想起自己来实现一个连接池。test了下,效果还可以,随记录之
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Stack;
public class ConnManager {
private static final int MIN_CONN = 2;
private static final int MAX_CONN = 5;
private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=RJ_Thesis";
private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String USER ="sa";
private static final String PASW= "sa";
private int connAmount = 0;
private static Stack<Connection> connStack ;
static {
connStack = new Stack<Connection>();
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static ConnManager instance;
public static synchronized ConnManager getInstance(){
if(null != instance){
return instance;
}
return new ConnManager();
}
private ConnManager(){
for(int i = 0 ; i < MIN_CONN ; i++){
connStack.push(newConnection());
}
}
public synchronized void freeConnection(Connection con){
connStack.push(con);
notifyAll();
}
public synchronized Connection getConnection(){
Connection con = null;
if(!connStack.isEmpty()){
con = connStack.pop();
}else if(connAmount < MAX_CONN){
con = newConnection();
}else{
try {
wait(1000);
return getConnection();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return con;
}
private Connection newConnection(){
try {
Connection connection = DriverManager.getConnection(URL, USER, PASW);
++connAmount;
return connection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}