自定义数据库连接池和代理模式

/*
*自定义数据可连接池的代理模式的思想:

  • 因为系统的Connection里面的close()方法是关闭功能,并不能实现连接之后把连接归还的作用,所以需要重写Close()方法。
  • 用代理类来装连接,把一个个的连接用代理类的对象来装,然后在代理类中重写Close()方法,而其他的功能还是由Connection来实现。把Connection传到代理类里面去。
  • 当用一个连接时,连接池里面就少一个连接,所以需要使用return list.remove(0);//只要有人用到一次一个连接,我们就减掉一个连接.
    
  • 当归还一个连接时,就把连接重新放回数据库连接池,这时需要使MypoolConnection.list.add(this);MypoolConnection是数据库连接池的类。
    */

package com.ghgj.poolConnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ArrayList;

public class MypoolConnection {
/**
* 创建一个数据库连接池
/
public static ArrayList list=new ArrayList<>();
{
try {
Class.forName(“com.mysql.jdbc.Driver”);//加载驱动
//创建几个连接出来
Connection con1 = DriverManager.getConnection(“jdbc:mysql://localhost:3306/aa”,“root”,“XGG000129”);
Connection con2 = DriverManager.getConnection(“jdbc:mysql://localhost:3306/aa”,“root”,“XGG000129”);
Connection con3 = DriverManager.getConnection(“jdbc:mysql://localhost:3306/aa”,“root”,“XGG000129”);
Connection con4 = DriverManager.getConnection(“jdbc:mysql://localhost:3306/aa”,“root”,“XGG000129”);
/

* 这里准备用代理类来装连接对象,用系统类Connection来连接,当使用close方法时就只能是关闭,没有归还连接的功能
* 用户后来拿到的连接就是代理类实现类归还连接的对象啦,这里的close()方法就是归还连接啦
*/
Proxy pro1=new Proxy(con1);
Proxy pro2=new Proxy(con2);
Proxy pro3=new Proxy(con3);
Proxy pro4=new Proxy(con4);
list.add(pro1);
list.add(pro2);
list.add(pro3);
list.add(pro4);
} catch (ClassNotFoundException e) {

		e.printStackTrace();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}   	  
       	}
 //对外提供一个连接数据库连接池的方法
 public static Connection getConnection(){
	 return list.remove(0);//只要有人用到一次一个连接,我们就减掉一个连接
 }

}

创建一个代理类,用来重写系统里面的Connection里面的close()方法,以便实现归还连接的功能
package com.ghgj.poolConnection;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.mysql.jdbc.ConnectionImpl;

public class Proxy extends ConnectionImpl{
private Connection con;

/*
 * 代理类
 */
public Proxy(Connection connection){
	/*
	 * 真正起作用的还是系统里的Connection这个类
	 * 所以把Connection这个类传起来
	 */
	this.con=connection;
	
}
@Override
public PreparedStatement prepareStatement(String sql) throws SQLException {
	
	return con.prepareStatement(sql);
}
@Override
public synchronized void close() throws SQLException {
	//谁调用close()这个方法就把这个连接还回数据库连接池里面去,重复利用连接
	MypoolConnection.list.add(this);
}

}

创建一个实现类,实现类要拿到数据库连接池里面的连接
package com.ghgj.poolConnection;

import java.sql.Connection;
import java.sql.SQLException;

public class ProxyTest {
public static void main(String[] args) {
//拿到数据库连接池的对象,拿到连接
MypoolConnection mpc=new MypoolConnection();
//拿到多个连接用来证实是否连接归还啦
//只要后面新建立的三个连接和上面四个连接有三个相同就说明连接已经实现归还啦
Connection con1= MypoolConnection.getConnection();
System.out.println(con1);
Connection con2= MypoolConnection.getConnection();
System.out.println(con2);
Connection con3= MypoolConnection.getConnection();
System.out.println(con3);
Connection con4= MypoolConnection.getConnection();
System.out.println(con4);

	try {
		con1.close();
		con2.close();
		con3.close();
		con4.close();
		
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println("新建立的三个连接");
	Connection con5= MypoolConnection.getConnection();
	System.out.println(con5);
	Connection con6= MypoolConnection.getConnection();
	System.out.println(con6);
	Connection con7= MypoolConnection.getConnection();
	System.out.println(con7);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值