//代码中肯定会有这么一段:
        finally
        {
            try
            {
                if(rs != null){
                    rs.close();
                    rs = null;
                }
                if (ps != null)
                {
                    ps.close();
                    ps = null;
                }
                if (conn != null)
                {
                    conn.close();
                    conn = null;
                }
            }
            catch (SQLException e)
            {
             e.printStackTrace();
            }
        }疑问: 
1,既然是用连接池,那么为什么会有 close 这样一说.close字面意义就是关闭.如果要向连接池管理对象归还这个连接至少也应该使用free或者end这样的单词.
2,使用close方法 意义很混乱, 这个操作背后究竟发生了什么呢,究竟是在什么情况下做了什么操作呢?
   1) 在获得的连接属于连接池内的连接的时候  这个close是关闭还是仅仅归还让池内数量归位?
   2) 在获得的连接属于非连接池内连接, 这个时候close 是关闭还是如何呢
   3) 由于close是个接口方法,里面层次我跟进去又太深,实在是找不到真正去实现他的那个类,里面源代码究竟写了写什么?
3,DriverManager.getConnection 之后究竟发生了什么, 什么情况下会获取连接池;什么情况下获取的是单独的连接
题外话
由于我们知道,数据库技术的连接方案也只不过是tcp方案的包装. 直白点说他就是个socket.
所以 肯定是存在 长连接的 (也就是连接之后非硬件性错误的话 他是永不断开的)那么,我同时也知道,socket server 除了拥有3000个左右连接毫无压力之外 还能做其他大把大把庞大而繁杂的业务逻辑运算.
那么,为什么数据库这东西对连接访问如此吃紧,以至于大家对连接池的控制在区区50个连接左右.对其操作还分外的畏手畏脚. 这难道不是莫大的讽刺吗?给个确切的理由吧, 还是.

解决方案 »

  1.   

    数据库连接池返回的连接,一般是通过动态代理生成的,而非原始的connection,因此,一般都会重写close方法,close不是关闭点连接,而是放回到池里面,这样做是为了不改变用户的使用习惯。
      

  2.   

    关闭只是关闭当前连接,连接池一般会配很多连接,需要的时候过来拿一个连接,不用的时候就要关闭,相当于归还给了连接池。以免以后取连接的时候,连接没有空余的,就回报sql异常DriverManager.getConnection只是得到了其中的一个连接
      

  3.   

    你可以试着打印一下:conn.getClass().getName()看一下到底connection是一个什么类型
      

  4.   

    根据JCA规范,DriverManager.getConnection得到的应该是逻辑连接吧,每个逻辑连接都对应一个物理连接(直接跟数据库相关的连接)。也就是说conn.close();这句话是针对逻辑连接所说的,意思是:清理当前的逻辑连接所对应的物理连接(释放物理连接),然后返回连接池当中。
      

  5.   

    若鱼说的是对的。 若是连接池的话,connection并非原生的connection一般都是代理对象。  掉用close只是把他放回连接池
      

  6.   

    看到一篇好文章:
    JDBC数据库连接池的实现及原理
    http://hi.baidu.com/sleinet/blog/item/d7329b165a3b7c55f3de328b.html