数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。外部使用者可通过getConnection方法获取连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。
数据库连接池技术带来的优势:1.资源重用。2.更快的系统响应速度。3.新的资源分配手段。4.统一的链接管理,避免数据库连接泄露。
下面是一个最小化的数据库连接池实现:
public class DBConnectionPoll implements ConnectionPool{
private static Vector pool;
private final int POOL_MAX_SIZE = 20;
private final int POOL_MAX_SIZE = 20;
//获得数据库连接
public synchronized Connection getConnection() throws DBException{
if(poll == null){
poll = new Vector();
}
Connection conn;
if(pool.isEmpty()){
conn = createConnection();
}else{
int last_idx = pool.size()-1;
conn = (Connection)pool.get(last_idx);
pool.remove(pool.get(last_idx));
}
return conn;
}
if(poll == null){
poll = new Vector();
}
Connection conn;
if(pool.isEmpty()){
conn = createConnection();
}else{
int last_idx = pool.size()-1;
conn = (Connection)pool.get(last_idx);
pool.remove(pool.get(last_idx));
}
return conn;
}
//返还数据库连接
public synchronized void releaseConnection(Connection conn){
if(pool.size() > POOL_MAX_SIZE){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}else{
pool.add(conn);
}
}
//创建数据库连接
private static Connection createConnection() throws DBException{
Connection con;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oracle",
"scott","tiger");
return conn;
}catch(ClassNotFoundException e){
throw new DBException("ClassNotFoundException");
}catch(SQLException e){
throw new DBException("SQLException");
}
}
}
if(pool.size() > POOL_MAX_SIZE){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}else{
pool.add(conn);
}
}
//创建数据库连接
private static Connection createConnection() throws DBException{
Connection con;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oracle",
"scott","tiger");
return conn;
}catch(ClassNotFoundException e){
throw new DBException("ClassNotFoundException");
}catch(SQLException e){
throw new DBException("SQLException");
}
}
}
上面的代码实现了一个最简单的连接池,因为简单,所以明了,目的只是展示数据库连接池实现的一般原理。当然这段代码在实际应用中还是有些问题的,由于getConnection方法返回的是一个标准的JDBC Connection,程序员由于编程习惯,往往在使用完后就close了。如此一来,连接无法得到重用,数据库连接池机制形同虚设。如果要解决这个问题,还需要使用一些模式,如:Decorator模式、Proxy模式等。在这里我就不做更详细的设计说明了。