自定义数据库连接池
第一步:实现DataSource接口
第二步:在程序初始化的时候,在内存中存放几个连接。
第三步:提供获得连接方法的实现
-
第四步:提供归还连接的方法
public class MyDataSource implements DataSource{ // 提供一个集合:List集合. private List listConn = new ArrayList(); // 提供构造方法: public MyDataSource() { // 在程序初始化的时候,初始化几个连接,并且将连接存入到集合中。 for (inti = 1; i <=3 ; i++) { // 获得连接: try { Connection conn = JDBCUtils.getConnection(); // 放入到集合中: listConn.add(conn); } catch (Exception e) { e.printStackTrace(); } } } @Override // 获得连接的方法 public Connection getConnection() throws SQLException { // 从内存中获得连接,将连接返回.从集合中获取即可。 Connection conn = listConn.remove(0); return conn; } // 归还连接: public void addBack(Connection conn){ listConn.add(conn); } …
编写连接池的测试
public voiddemo1() throws SQLException{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
MyDataSource dataSource = new MyDataSource();
try{
// 获得连接
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from account";
// 预编译sql:
pstmt = conn.prepareStatement(sql);
// 设置参数
// 执行sql:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
// 释放资源:
rs.close();
pstmt.close();
// 归还连接
dataSource.addBack(conn);
}
}
-
现在自定义的连接池中存在两个问题:
1.获得连接池的时候没有面向接口编程
2.自定义一个连接池需要使使用者额外记住一些API
- 解决这个问题:不在自定义连接池中定义额外方法,最好调用conn的close方法,将原有的close的销毁变为归还。涉及到如何增强Java中的某个类的某个方法。
- 1.继承的方式
- 必须你能够控制这个类的构造。
- 2.使用装饰者模式
- 增强的类和被增强的类实现相同的接口
- 在增强的类中获得被增强的类的引用
- 缺点:接口中的方法过多,需要将其他没有增强的方法都的实现。
- 3.使用动态代理
-
使用装饰者模式增强Connection的close方法
public class MyConnection extends ConnectionWrapper{ private Connection conn; private List list; public MyConnection(Connection conn,List list) { super(conn); this.list = list; } @Override public void close() throws SQLException { list.add(conn); // conn.close(); } }
-
- 1.继承的方式