黑马程序员技术交流社区

标题: 关于数据库连接池的一点小问题 [打印本页]

作者: 蚊子爸爸    时间: 2018-4-19 21:06
标题: 关于数据库连接池的一点小问题
自定义的数据库连接池的时候,我们改写了Connection的close()方法,将原本的方法改写为list.add(conn)。这样做是实现了归还了并没有释放资源,只是做了归还,那么资源是怎么释放的?
新人求大神指教

采用的适配器——装饰设计模式

部分代码如下:
//定义一个ConnectionWrapper重写所有Connection接口的方法(不需要的不写了。。。)
public class ConnectionWrapper implements Connection{

       
        private Connection conn;

        public ConnectionWrapper(Connection conn) {
                super();
                this.conn = conn;
        }
...
}
//定义一个MyConnection类继承ConnectionWrapper类,重写我们需要的方法(close()方法)

public class MyConnection extends ConnectionWrapper {

        private ArrayList<Connection> array;
        private Connection conn;

        public MyConnection(Connection conn,ArrayList<Connection> array) {
                super(conn);
                this.array = array;
                this.conn = conn;
        }

        public void close() throws SQLException {
                array.add(this);
        }
       
}

//自定义数据库连接池(实现DataSource接口)

private ArrayList<Connection> array = new ArrayList<>();

        public MyDataSource() {
                // TODO Auto-generated constructor stub
                for (int i = 0; i < 10; i++) {
                        Connection conn = DBCPUtlist.getConnection();
                        Myconnection my = new Myconnection(conn, array);
                        array.add(my);
                }

        }

        @Override
        public Connection getConnection() throws SQLException {
                // TODO Auto-generated method stub
                return array.remove(0);
        }
...
}

//然后在定义test测试类测试
public class Test {
        public static void main(String[] args) {
                MyDataSource mdy = new MyDataSource();
                Connection conn = null;
                Statement stat = null;
                ResultSet rs = null;
                try {
                        conn = mdy.getConnection();
                        stat = conn.createStatement();
                        //执行SQL语句, 获取结果集
                        String sql = "select * from user;";
                        rs = stat.executeQuery(sql);
                        //操作结果集
                        while(rs.next()) {
                                System.out.println(rs.getInt("id") + "..." + rs.getString("name")+ "..." +
                        rs.getString("pwd") );
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        DBCPUtlist.remove(conn, stat, rs);
                }
        }
}

代码是能完成预定的目标的,但是想不明白最后连接池是如何释放资源的,求大神指教
作者: 播妞    时间: 2018-4-20 11:12





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2