Utilice un patrón de fábrica abstracto para simular el grupo de conexiones JDBC
Patrón de método de
fábrica patrón de fábrica simple patrón de
fábrica abstracto
1. Grupo de conexiones
Grupo de conexiones: el grupo de conexiones es una tecnología para crear y administrar un grupo de conexiones de búfer, estas conexiones están listas para ser utilizadas por cualquier hilo que las necesite.
Aquí utilizo el patrón de fábrica abstracto para simular simplemente el grupo de conexiones de la base de datos
2. Preparación
Primero, descubra los cuatro roles en la fábrica abstracta
Lo que necesitamos es un grupo que se pueda usar para obtener conexiones de base de datos directamente, por lo que el objeto específico es el grupo de conexiones de base de datos y el objeto abstracto es el objeto de conexión de base de datos Objeto de conexión.
La fábrica abstracta define el comportamiento general del grupo de conexiones de la base de datos, crea un grupo de conexiones, obtiene una conexión y recicla una conexión.
La fábrica de hormigón hereda la fábrica abstracta y refina el comportamiento del grupo de conexiones, como obtener las conexiones disponibles actualmente, etc.
Fábrica abstracta: comportamiento general del grupo de conexiones
Fábrica de hormigón: herede la fábrica abstracta y proporcione el comportamiento concreto del grupo de conexiones.
Objeto abstracto: Conexión
Objeto específico: grupo de conexiones de base de datos
Una vez que descubra esto, puede comenzar a trabajar
3. Darse cuenta
Fábrica abstracta:
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();
}
Fábrica específica:
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;
}
}
Llamada del cliente
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();//这个时候已经连接池中已经没有可用的连接了
}
}
Archivo de configuración
consejo: se requiere un paquete jar (mysql-connector-java.jar) para conectarse a la base de datos