自定义一个简单的JDBC连接池(2)

现在有一个小问题就是,我们的关闭连接是通过连接池的方法来实现的,但是,如果用户调用Connection对象的close方法,那么连接时被销毁了,并没有返回给连接池,那么我们来优化它,让用户使用close()方法不会去销毁连接,而是去归还连接。

方案有很多中,这里采用装饰着模式的一种。

优化:

1.新建一个类MyConnection来实现Connection接口,其中他有属性类型为Connection conn和一个Liis<Connection>。

private Connection conn; private List<Connection> pool; public MyConnection(Connection conn, List<Connection> pool) { this.conn = conn; this.pool = pool; }

2.然后实现接口的close方法

@Override public void close() throws SQLException { System.out.println("回收连接"); pool.add(conn); }

3.然后实现他获取Statement的方法,如果不实现那么获取此Statement会出现空指针错误,我这里就只实现了PreparedStatement的获取方法

@Override public PreparedStatement prepareStatement(String sql) throws SQLException { System.out.println("获得Statement"); return conn.prepareStatement(sql); }

4.然后删除掉MyDataSource类中归还连接的方法backConnection,并将构造方法和获取连接的方法做如下改造

public MyDataSource2() { for (int i = 0; i < 5; i++) { Connection conn = getOneConnection(); MyConnection myConn = new MyConnection(conn, connectionList); connectionList.add(myConn); } }

 

 

@Override public Connection getConnection() throws SQLException { Connection conn = null; if(connectionList == null || connectionList.size() <= 0){ Connection connection = getConnection(); MyConnection myConn = new MyConnection(connection, connectionList); connectionList.add(myConn); } conn = connectionList.remove(0); return conn; }

好了,这样用户直接调用我们的Connection的close方法就不会去销毁连接了,会正确的归还给了连接池了,对测试代码稍做修改即可测试。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/386c28c5800423bc4afc314e89e553b1.html