数据库的session也会有timeout吧?
不close,到时间connection应该会断的

解决方案 »

  1.   

    要关闭的
    因为一般来说
    数据库缓冲池都用proxy之类的模式重写了Connection
    这时用close方法
    并不是真正关闭了数据库
    而是将该connection返回到数据库缓冲池
    如果不close,尽管过段时间会自动返回数据库缓冲池
    但在大量数据操作时,仍然可能引起缓冲池中没有可用连接,从而创建新连接
    使速度变慢
    所以要关闭
      

  2.   

    对,应为早期的连接池,是用类似freeConnection的
    另一个函数来归还连接池的,但是在一个team开发里面
    大家水平不齐,有些人调用连接池取得连接,而归还的
    时候关闭了连接(调用了conn.close()),这样造成了
    隐患,所以后来用动态代理等方式重写close。例如:
    public Object invoke(Object proxy, Method m, Object[] args) 
    throws Throwable 
    {
    Object obj = null;
    //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
    if(CLOSE_METHOD_NAME.equals(m.getName()))
    setInUse(false);
    else
    obj = m.invoke(conn, args);
    //设置最后一次访问时间,以便及时清除超时的连接
    lastAccessTime = System.currentTimeMillis();
    return obj;
    }
      

  3.   

    如果你愿意的话,可以重载Connection的close()方法,在这个方法中把连接放回到连接池当然也可以不重载,自己另写一个方法,数据库使用完毕之后不close()
      

  4.   

    因为一般来说
    数据库缓冲池都用proxy之类的模式重写了Connection
    这时用close方法
    并不是真正关闭了数据库
    而是将该connection返回到数据库缓冲池
    ////////////////////////////////////////////////////////////
    谁能给个重写Connection对象的close()函数的例子?如何才能实现以上效果?
      

  5.   

    建议楼上看一下JIVE的数据库连接池
      

  6.   

    to showmetheway(雪儿甜心)
    上面不是已经给你例子了么!
      

  7.   

    Connection只是一个接口,当程序执行下面的语句时
    Connection conn = pc.getConnection(); 
    得到的是一个实现Connection接口的类,里面的具体的实现是你使用的数据库系统提供的JDBC驱动程序决定的。
    当你需要使用连接共享池的时候,在你的程序和jdbc驱动之间多了一层共享池,共享池实现Connection接口,共享池里面的代码如何处理conn.close()方法,你在外面是看不到的,它也许真的关闭了连接,也许只是给这个Connection加了一个标记,表示它处于空闲状态。
    不知道我的解释你是否明白,如果不明白,最好搞个共享池的源代码看看。