作业:使用单例模式模拟数据库连接池。要求客户端代码可以获取连接池的唯一对象,并且可以从池中随机取一个连接对象来连接数据库。
使用单例模式实现数据库连接池对象。
单例模式的优点:
- 提供对唯一实例的受控访问;
- 节约系统资源,防止出现Java版内存泄露;
- 允许可变数目的实例(没看懂)。
单例模式的缺点
- 没有抽象层,对拓展有很大困难;
- 单例类指责过重;
- 语言的垃圾回收机制可能导致共享的单例对象状态丢失。
适用场景
- 系统只需要一个实例对象;
- 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
我的代码
package test;
import java.util.LinkedList;
class Connection {
private int id;
public Connection(int id) {
this.id = id;
}
public String toString() {
return String.valueOf(id);
}
}
class DataSource {
private int maxCount; // 最大连接数
private int minCount; // 最低连接数
private int nowCreatedCount = 0; // 当前已创建连接数
private LinkedList<Connection> connections = new LinkedList<Connection>();
private static class HolderClass { //使用IoDH方式获取单例
private static final DataSource instance = new DataSource();
}
public static DataSource getInstance() {
return HolderClass.instance;
}
private DataSource() {
// 假设从配置文件中读取到了数据
maxCount = 10;
minCount = 5;
nowCreatedCount = 0;
if (minCount > maxCount) {
throw new ExceptionInInitializerError("数据库连接池初始化异常");
}
for (int i = 0; i < minCount; i++) {
Connection conn = new Connection(i);
connections.addLast(conn);
nowCreatedCount++;
}
System.out.println("数据库连接池初始化完毕,当前已创建连接个数为:" + nowCreatedCount);
}
public Connection getConn() throws Exception {
synchronized (connections) {
if (this.connections.size() > 0) {
System.out.println("成功获取连接");
return connections.removeLast();
}
if (nowCreatedCount < maxCount) {
Connection conn = new Connection(nowCreatedCount++);
System.out.println("增加连接,当前已创建连接个数为:" + nowCreatedCount);
System.out.println("成功获取连接");
return conn;
}
}
throw new Exception("connection full!");
}
public void free(Connection conn) {
connections.addLast(conn);
}
}
public class PlayConnectionPool {
public static void main(String[] args) throws Exception {
DataSource ds = DataSource.getInstance();
System.out.println(ds.getConn());
System.out.println(ds.getConn());
System.out.println(ds.getConn());
System.out.println(ds.getConn());
System.out.println(ds.getConn());
System.out.println(ds.getConn());
System.out.println(ds.getConn());
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于