在web环境中,每次与数据库的连接都会有很大的花销,如果频繁的连接数据库会影响性能,所以实际项目中,必须使用数据库连接池来提高数据库的连接效率。它的原理其实就是建立一个linkedList 集合来存放这些connection 当使用时 remove掉,使用完毕释放时,在add 进去,每次拿取connection的时候我们就先从LinkedList 来找,如果有没有使用的connection ,没有连接的话 在创建一个。注:因为我们需要频繁的add 和 remove 所以选择 linkedList 链式结构的集合,因为LinkedList 并不是安全的,需要加锁
public class DBConnectionPool {一般项目中常用的数据源有DBCP,C3P0等。先初始化将xml文件解析,完了将一些连接属性装入一个javaBean中,之后有了连接属性,就可以创建连接池实例。
private Connection con = null;
/** 使用的连接数 */
private int inUsed = 0;
/** 容器,空闲连接 */
private LinkedList<Connection> cnPool = new LinkedList<Connection>();
/** 最小连接数 */
private int minConn;
/** 最大连接 */
private int maxConn;
/** 连接池名字 */
private String name;
/** 密码 */
private String password;
/** 数据库连接地址 */
private String url;
/** 驱动 */
private String driver;
/** 用户名 */
private String user;
/** 定时 */
public Timer timer;
/**
* 创建连接池
*
* @param driver
* @param name
* @param URL
* @param user
* @param password
* @param maxConn
*/
public DBConnectionPool(String name, String driver, String URL, String user, String password, int maxConn) {
this.name = name;
this.driver = driver;
this.url = URL;
this.user = user;
this.password = password;
this.maxConn = maxConn;
}
/**
* 用完,释放连接
*
* @param con
*/
public synchronized void freeConnection(Connection con) {
this.cnPool.add(con);
this.inUsed--;
}
/**
*
* 从连接池里得到连接
*
* @return
*/
public synchronized Connection getConnection() {
Connection con = null;
if (this. cnPool.size() > 0) {
con = (Connection) this.cnPool.get(0);
this.cnPool.remove(0);
if (con == null){
con = getConnection();
}
} else {
con = newConnection();
}
if (this.maxConn == 0 || this.maxConn < this.inUsed) {
con = null;
}
if (con != null) {
this.inUsed++;
System.out.println("得到 " + this.name + " 的连接,现有" + inUsed + "个连接在使用!");
}
return con;
}
/**
* 释放全部连接
*
*/
public synchronized void release() {
Iterator allConns = this.cnPool.iterator();
while (allConns.hasNext()) {
Connection con = (Connection) allConns.next();
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
this.cnPool.clear();
}
/**
* 创建新连接
*
* @return
*/
private Connection newConnection() {
try {
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("没有发现 DB driver");
} catch (SQLException e1) {
e1.printStackTrace();
System.out.println("创建 connection 失败");
}
return con;
}