静态代理模式
1.静态代理模式,使用数据库连接池为例
代理类,这里只演示了需要使用的方法
代理类需要持有被代理类对象和源对象
/**
* 代理对象
*/
public class ConnectionProxy implements Connection {
/**
* 被代理对象
*/
private Connection connection;
/**
* 源对象
*/
private SmDataSource smDataSource;
public ConnectionProxy(Connection connection , SmDataSource smDataSource){
//需要接收一个被代理对象,还需要接收一个源对象
this.connection = connection;
this.smDataSource = smDataSource;
}
@Override
public void close() throws SQLException {
//被代理对象中,需要替换的方法
//使用源对象中的同名close方法
smDataSource.back(connection);
}
数据库连接池类
/**
* 类描述:维护数据库连接池
*
* @ClassName SmDataSource
* @Description TODO
* @Author 小鹏
* @Date 2022/6/2 20:30
* @Version 1.0
*/
public class SmDataSource {
//链表集合
private static LinkedList<Connection> list = new LinkedList<>();
private String url;
private String username;
private String password;
//连接池大小
private Integer initSize;
public SmDataSource(){
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建数据库连接对象,存入linkedlist中
public void init(){
for (int i = 0; i < initSize; i++) {
try {
Connection connection = DriverManager.getConnection(url, username, password);
//创建代理对象 传入被代理类connection和源对象,SMDataSource本身调用了初始化方法,这里就传入this
ConnectionProxy connectionProxy = new ConnectionProxy(connection, this);
//将代理对象加入链表
list.add(connectionProxy);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Connection getConn(){
//弹出一个数据库连接池对象
return list.pop();
}
/**
* 需要执行的close方法
*/
public void back(Connection connection) {
//需要接收一个待关闭的connection对象
//将连接对象放入链表尾部
list.addLast(connection);
}
//获取数据库连接池大小
public int getSize(){
return list.size();
}
测试类
/**
* 类描述:测试静态代理
*
* @ClassName TextProxy
* @Description TODO
* @Author 小鹏
* @Date 2022/6/2 20:27
* @Version 1.0
*/
public class TextProxy {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
SmDataSource smDataSource = new SmDataSource();
smDataSource.setInitSize(10);
smDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/704a");
smDataSource.setUsername("root");
smDataSource.setPassword("root");
//执行数据库连接池初始化方法
smDataSource.init();
System.out.println("数据库连接池大小:"+smDataSource.getSize());
//获取数据库连接兑现
Connection conn = smDataSource.getConn();
PreparedStatement ps = conn.prepareStatement("select * from sys_user where id = ?");
ps.setInt(1,1);
ResultSet resultSet = ps.executeQuery();
resultSet.next();
String uname = resultSet.getString("uname");
System.out.println(uname);
conn.close();
System.out.println("数据库连接池大小:"+smDataSource.getSize());
}
}

浙公网安备 33010602011771号