一个完整的连接池应用包括三个部分:DBConnectionPool类,负责从连接池获取(或创建)连接、将连接返回给连接池、系统关闭时关闭所有连接释放所有资源;DBConnectionManager类,负责装载和注册JDBC驱动、根据属性文件中定义的属性创建DBConnectionPool、跟踪应用程序对连接池的引用等;应用程序对连接池的使用。
现在实现的数据库连接池包括一个管理类DBConnectionManager,负责提供与多个连接池对象(DBConnectionPool类)之间的接口。每一个连接池对象管理一组封装过的JDBC连接对象Conn,封装过的JDBC连接对象Conn可以被任意数量的Model层的组件共享。
类Conn 的设计很简单,如下所示:
Class Conn {
Private java. sgl .Connection con; //数据库连接对象
Public Boolean inUse ; //是否被使用
Public long lastAccess; //最近一次释放该连接的时间
Public int useCount; // 被使用次数
}
下面是实现连接池的主要代码:
// 初始化数据库连接池
public static synchronized void FastInitPool()
throws Exception {
try { Class.forName(driver);
for (int i=0; i<SIZE; {
Connection con = createConnection();
if (con!=null) addConnection(con);
} } }
// 向连接池对象中添加数据库连接
private static void addConnection(Connection con) {
if (pool=null||pool1=null) {
pool=new Vector(size);
pool1=new Vector(size); }
pool.addElement(con);
pool1.addElement("false"); }
// 获取数据库连接
public static synchronized Connection getConn()
throws Exception {
Connection conn = null;
try { if (driver = null)
FastInitPool();
// 获得一个可用的(空闲的)连接
.for (int i = 0; i < pool.size(); i++) {
conn = (Connection)pool.elementAt(i);
if (pool1.elementAt(i)=="false") {
pool1.set(i,"true");
//System.out.println("从连接池中获取第"+(i+1)+"个空闲连接");
return conn;
}
}
//如果没有可用连接,且已有连接数小于最大连接数限制,则创建并增加一个新连接到连接池
conn = createConnection();
pool.addElement(conn);
pool1.addElement("true");
// System.out.println(" 所有连接都在使用,在连接池中再创建一个新连接");
}
catch (Exception e) {
System.err.println(e.getMessage());
throw new Exception(e.getMessage());
}
return conn; //返回一个有效的新连接
}
public Connection getConnection(String strDriver, String strUrl, String strUserName, String strPassWord)
throws SQLException{
try{ Class.forName(strDriver);
conn = DriverManager.getConnection(strUrl, strUserName, strPassWord); }
return conn; }
当前Web应用程序广泛采用B/S结构,其并发性决定了多用户同时访问数据库的问题。本文阐述的基于JDBC的数据库连接池技术已成功应用于基于Web的高职教学系统开发中,并建立了数据库连接池实例来说明和证实连接池的访问方法。只有充分运用连接池访问技术,才能提高数据库的访问效率,改善Web应用,从而减少系统开销,大大提高整个Web应用系统的运行效率。