刚买了深入浅出hibernate,打算研究一段时间.昨天看到第一章的Connection pool小节的时候,心理七上八下的.我原来所用的数据库连接都是公司自己写的一个Connection,以为不会有什么问题.印象中查看的日志都是,
新增xx连接
清除xx连接
以前调用连接的时候都是
if(conn != null)
try
{
}catch(Exception e){}{finally{db.closeDB();}在查看下closeDB()方法,竟然是{conn.close();connManager.freeConnection(conn);.
晕了,这样都Connection.conn.close();了,还用得着freeConnection,连接池就一点用处都没有了.
重新设置了maxconn=10后,修改freeConnection().
有两个问题请教下:
maxconn的设置有什么依据?
我设置了maxconn=10,那么数据库中始终打开着10个的数据库连接,那么要维持这10个连接需要一定的系统资源,系统是怎么维护这10个数据库连接的.

解决方案 »

  1.   

    这些都是连接池应该负责的。
    维持10个连接只要有对这些连接的引用就可以了。
    其实我们在操作的时候不能够关闭连接。
    我们所作的conn.close();其实就是把连接重新还给连接池。第二个问题:我不知道连接还能被清楚。就算是能够清楚。也是具体连接池自动运行的。估计没有给客户提供接口。但是现在连接池种类这么多。所以我也不好说。
      

  2.   

    我们所作的conn.close();其实就是把连接重新还给连接池。
    --------------这句话有点疑问:
    由于getConnetction方法返回的是一个jdbc的connection,程序员由于编成习惯,可能会习惯性的调用其close方法关闭连接.如此一来,连接便无法得到重用,数据库连接池机制形同虚设.
    这是深入浅出 hibernate中写的.不知道是否我理解错了.看下我的freeConnection()方法;
        public synchronized void freeConnection(Connection con) {
          if(freeConnections.size()>maxConn)
          {
           try
           {
           con.close();
           freeConnections.removeElement(con);
           log.write("清除" + name + "的连接");
           }catch(SQLException e){
           }finally{}
          }
          else
          {
           freeConnections.addElement(con);
          }
        }也就是说在连接数没有达到maxConn的时候,是不关闭连接的.第二个问题,我是想说,如果数据库中有连接是不活动的(不知道这样说是否正确,期待指教),那么过一段时间把该连接close掉.
      

  3.   

    在使用DriveManager类来做JDBC直连的时候,调用conn.close();是关闭了应用服务器与数据库的物理连接.使用连接池的时候调用conn.close();其实只是把连接还给连接池,实际的物理连接没有关闭.另外连接池维持连接其实是通过定时发送一条查询指令,从而保持连接的持续存在.