日期:2014-05-16  浏览次数:20402 次

数据库连接池的思考

众所周之,java中操作的都是对象的引用,如下例

        Obj1 obj1 = new Obj1();
        Obj2 obj2 = new Obj2();
        obj2.setObj1(obj1);
        log.info(obj1 == obj2.getObj1());
        obj1 = null;
        log.info(obj2.getObj1()==null);

obj1与obj2中的属性实际上是两个引用,都指向了同一个对象;

如果把obj1设为null,实际上是取消了obj1对该对象的引用,此时obj2中的属性的引用还指向该对象;

java垃圾回收时,实际是判断一个对象是否被引用,如果没有引用则将该对象销毁;

?

那么在数据库连接池(如DBCP)中,如果从连接池中借出一个连接不归还的话,数据库连接池是有办法将该连接回收的;

实际上我们借出来的是一个引用,数据库连接池管理的也是一个引用;

数据库连接池判断是否回收连接,实际是记录了该引用借出的时间,如果超过了设定时间还未归还,将连接池中管理的引用设为null,取消了连接池中引用对该连接对象的引用,而且其假设用户借出的引用也是使用完毕,用户借出的引用也不再指向该连接对象了,这样在下一次垃圾回收时,该连接对象因为没有被引用从而被回收了;

我们在一个方法内部创建的引用,在方法结束后,引用全都被自动销毁,取消了与实际内存中对象的引用,从而保证了对象被回收;

但是如果用户通过静态对象保留了该引用,未将其销毁,那么即使数据库连接池从池中将引用关闭,实际上用户保留的引用也是可以继续使用的。

?

以上仅为猜测,有时间测试一下~~

?