A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

蚊子爸爸

初级黑马

  • 黑马币:17

  • 帖子:5

  • 精华:0

© 蚊子爸爸 初级黑马   /  2018-4-19 21:06  /  1116 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

自定义的数据库连接池的时候,我们改写了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);
                }
        }
}

代码是能完成预定的目标的,但是想不明白最后连接池是如何释放资源的,求大神指教

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马