抽象ファクトリパターンを使用して、データベース接続プールを単純にシミュレートします

抽象ファクトリパターンを使用してJDBC接続プールをシミュレートします

ファクトリメソッドパターン
シンプルファクトリパターン
抽象ファクトリパターン

1.接続プール

接続プール:接続プールは、接続のバッファプールを作成および管理するためのテクノロジであり、これらの接続は、接続を必要とするすべてのスレッドですぐに使用できます。

ここでは、抽象ファクトリパターンを使用して、データベース接続プールを単純にシミュレートします

2.準備

まず、抽象ファクトリでの4つの役割を理解します

必要なのは、データベース接続を直接取得するために使用できるプールです。したがって、特定のオブジェクトはデータベース接続プールであり、抽象オブジェクトはデータベース接続オブジェクトの接続オブジェクトです。

抽象ファクトリは、データベース接続プールの一般的な動作を定義し、接続プールを作成し、接続を取得して、接続をリサイクルします。

具象ファクトリは抽象ファクトリを継承し、現在使用可能な接続の取得など、接続プールの動作を改良します。

抽象ファクトリ:接続プールの一般的な動作

具象ファクトリ:抽象ファクトリを継承し、接続プールの具象動作を提供します

抽象オブジェクト:接続

特定のオブジェクト:データベース接続プール

これを理解したら、作業を開始できます

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();//这个时候已经连接池中已经没有可用的连接了
	}
	
}

ここに画像の説明を挿入
構成ファイル
ここに画像の説明を挿入

ヒント:データベースに接続するには、jarパッケージ(mysql-connector-java.jar)が必要です。

おすすめ

転載: blog.csdn.net/weixin_45355510/article/details/112847553