一、背景
记得刚开始学java jdbc部分的时候,每次我们要操作数据库,都先要去创建一次数据库连接。想想如果是在实际的系统中,我们每次点击查询,增加,修改的操作,每次都要去重新创建数据库连接的话,那是得多慢,而且如果请求越多,创建的数据库连接是不是就越多?那么内存占用是不是就越多?享元模式就是来解决这种问题的。
二、概念
享元模式:利用共享技术来支持大量的细粒度对象。也就是说享元模式利用对象的共享来解决同类对象占用大量内存的问题。我们熟悉的数据库连接池便是享元模式的真实写照。
三、代码实例
/**
* 数据库连接池
*/
class ConnectPool {
private Vector<Connection> pool;// 连接池 vector 是线程安全的
// 公有属性
private String url = "127.0.0.1:3306/jdbc";
private String userName = "root";
private String password = "root";
private String driveClassName = "com.mysql.jdbc.Driver";
private int poolsize = 100;// 连接池大小
private ConnectPool instance = null;
private Connection connection = null;
public ConnectPool() {// 构造方法 初始化
pool = new Vector<Connection>(poolsize);
for (int i = 0; i < poolsize; i++) {
try {
Class.forName(driveClassName);
connection = DriverManager.getConnection(url, userName,
password);
pool.add(connection);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/* 返回连接到连接池 */
public synchronized void release(Connection conn) {
pool.add(conn);
}
/* 返回连接池中的一个连接 */
public synchronized Connection getConnection() {
if (pool.size() > 0) {
Connection c = pool.get(0);
pool.remove(c);
return c;
} else {
return null;
}
}
}
public class FlayweightPatternDemo {
public static void main(String agrs[]) {
ConnectPool cpPool = new ConnectPool();
Connection c = cpPool.getConnection();// 拿到一个连接
/*
* 数据库操作......
*/
cpPool.release(c);// 用完之后放回连接池
}
}