实现一个DataSource的其实很简单,建一个list集合,存放多个connection,对每一个connection重写其close方法,不要让其真实的关闭,而是回放到list集合中,这个可以使用动态代理解决
代码如下
public class MyDataSource implements DataSource {
private String username;
private String password;
private String url;
private String driverClassName;
private List<Connection> list = new ArrayList<Connection>();
private boolean flag = true;
private void init() throws ClassNotFoundException {
flag = false;
Class.forName(driverClassName);
for(int i = 0; i < 5; i++) {
Connection proxy2 = (Connection) Proxy.newProxyInstance(
//类加载器
Thread.currentThread().getContextClassLoader(),
//接口
new Class[]{Connection.class},
//代理
(proxy, method, args) -> {
//重写close方法
if(method.getName().equals("close")) {
list.add((Connection)proxy);
return null;
} else {
//其他方法不变
return method.invoke(DriverManager.getConnection(url, username, password), args);
}
});
list.add(proxy2);
}
}
@Override
public Connection getConnection() {
if(flag) {
try {
init();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
if(list.size() > 0) {
return list.remove(0);
}
throw new RuntimeException();
}
}