使用抽象工厂模式简单模拟数据库连接池
程序员文章站
2022-03-10 21:36:20
使用抽象工厂模式模拟JDBC连接池工厂方法模式简单工厂模式抽象工厂模式1.连接池连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。在这里我使用抽象工厂模式简单模拟数据库连接池2.准备首先搞清楚抽象工厂中的四个角色我们需要的是一个可用直接拿到数据库连接的池,因此具体对象就是数据库的连接池,抽象对象就是数据库连接对象Connection对象,抽象工厂里面定义数据库连接池的通用行为,创建一个连接池,拿到一个连接,回收一个连接。具体工厂继承抽象工厂同时细...
使用抽象工厂模式模拟JDBC连接池
1.连接池
连接池:连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
在这里我使用抽象工厂模式简单模拟数据库连接池
2.准备
首先搞清楚抽象工厂中的四个角色
我们需要的是一个可用直接拿到数据库连接的池,因此具体对象就是数据库的连接池,抽象对象就是数据库连接对象Connection对象,
抽象工厂里面定义数据库连接池的通用行为,创建一个连接池,拿到一个连接,回收一个连接。
具体工厂继承抽象工厂同时细化连接池的行为,比如获取当前可用连接等等。
抽象工厂:连接池的通用行为
具体工厂:继承抽象工厂,并提供该连接池的具体行为
抽象对象:Connection
具体对象:数据库的连接池
搞清楚这些就可以开始动手了
3.实现
抽象工厂:
public abstract class Pool {
public Driver driver = null;//驱动对象
public String propertiesName = "jdbc.properties";//配置文件名称
public int normalConnect = 10;//保持连接数
public String driverName = null;//驱动字符串
public String username;//用户名
public String password;//密码
public String url;//地址
{//静态代码块初始化成员变量
InputStream is = Pool.class.getResourceAsStream(propertiesName);
Properties p = new Properties();
//加载配置文件
try {
p.load(is);
this.driverName = p.getProperty("driverName");
this.username = p.getProperty("username");
this.password = p.getProperty("password");
this.url = p.getProperty("url");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 注册JDBC驱动
*/
@SuppressWarnings("deprecation")
public void loadDriver() {
try {
Driver driver = (Driver) Class.forName(driverName).newInstance();
this.driver = driver;
System.out.println("驱动注册成功"+driverName);
} catch (Exception e) {
e.printStackTrace();
System.out.println("驱动注册失败检查驱动字符串是否正确");
}
}
/**
* 从连接池中拿到一个连接
* @return
*/
public abstract Connection getConnection();
/**
* 把一个连接返回连接池
* @param con 连接对象
*/
public abstract void freeConnection(Connection con);
/**
* 关闭所有的连接,撤销驱动注册
*/
public abstract void release();
}
具体工厂:
public class DBconnectionPool extends Pool {
// 空闲连接
private int num = 0;
// 存储连接的容器
private Vector<Connection> freeConnections = new Vector<Connection>();
/**
* 初始化
*/
public DBconnectionPool() {
super.loadDriver();// 加载驱动
for (int i = 0; i < normalConnect; i++) {// 创建连接
freeConnections.add(newConnection());
num++;
}
}
/**
* 从连接池中拿到一个连接
*
* @return
*/
@Override
public Connection getConnection() {
if (freeConnections.size() > 0) {// 连接池中有空闲连接
Connection con = freeConnections.get(0);
freeConnections.removeElementAt(0);
num--;
System.out.println("客户端拿取了一个连接"+con);
return con;
}
System.out.println("连接池无可用连接");
return null;
}
/**
* 把一个连接返回连接池
*
* @param con 连接对象
*/
@Override
public void freeConnection(Connection con) {
freeConnections.add(con);
num++;
System.out.println("客户端放回了一个连接");
}
/**
* 关闭连接,并注销驱动
*/
@Override
public void release() {
freeConnections.removeAllElements();//移除所有连接
num=0;
try {
DriverManager.deregisterDriver(driver);//注销驱动
} catch (SQLException e) {
e.printStackTrace();
System.out.println("驱动注销失败");
}
System.out.println("连接池已经关闭");
}
/**
* 创建一个连接
*
* @return
* @throws SQLException
*/
public Connection newConnection() {
try {
Connection con = DriverManager.getConnection(url, username, password);
System.out.println("连接池创建了一个连接");
return con;
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接创建失败");
return null;
}
}
/**
* 返回可用连接
*
* @return
*/
public int getNum() {
return num;
}
}
客户端调用
public class Client {
public static void main(String[] args) throws SQLException {
//创建连接池
DBconnectionPool pool = new DBconnectionPool();
System.out.println(pool.getNum());//10
//拿到一个连接
Connection con1 = pool.getConnection();
pool.getConnection();//再次获取
System.out.println(pool.getNum());//8
pool.freeConnection(con1);//放回一个连接
con1.close();
System.out.println(pool.getNum());//9
pool.release();//注销连接池
pool.getConnection();//这个时候已经连接池中已经没有可用的连接了
}
}
配置文件
tip:连接数据库需要一个jar包(mysql-connector-java.jar)
本文地址:https://blog.csdn.net/weixin_45355510/article/details/112847553