我现在的项目使用Tomcat 连接池连接数据库,要求每次连接数据库后,必须手工执行connection.close()来关闭连接,但,最近看到一些人说,tomcat本身具体回收connection机制,它会把你不用的connection回收. 如果真的是这样,开发人员就不必每次都手工执行connection.close(),免去不少麻烦.
我的问题是,tomcat是否真的具有自动回收connection机制?  有没有人试过不用执行connection.close(),但系统能正常运行的?

解决方案 »

  1.   

    这个可能需要一段时间才能才能释放,并不是你不用它就会释放的,
    我用的是weblogic连接池,估计两者的原理差不多,我设置它的初始化连接数为200,
    平常运行不会出问题,但是访问量达到一定的数量就会出问题,数据库的连接实例全被用光,
    导致系统直接挂掉,后来使用手动释放连接就没事了。如果访问量不高,不写应该问题不大吧,我也没做过实验,但是根据我的实际应用,应该问题不大。
    我那个程序白天的访问量大概是1000次/分钟
      

  2.   

    tomcat具有自动回收connection机制.可以在%Tomcat_Home%/conf/server.xml中   
        <Environment name="simpleValue" type="java.lang.Integer" value="30"/> 
    配置。
      

  3.   

    呵呵,连接池的概念本身就是代理管理Connection,从连接池取到Connection一般都会被改写close方法
    当你调用从连接池获得的Connection的close()方法时候,实际上它只是被换给连接池,并不会真正关闭这就是连接缓存的概念证明很简单,你拿到Connection,setReadOnly(true),用完close()
    不就之后你会发现获得的连接无法进行update/insert/delete,原因就是这些连接正是被缓存起来被你上次调用查询时setReadOnly过的同一个对象
      

  4.   


    看这样就足够了?看去看好象还有东西没说. simpleValue 是什么值,固定的吗? value="30" 有什么用呢?
      

  5.   


    这样就足够了?好象还有东西没说. simpleValue 是什么值,固定的吗? value="30" 有什么用呢?
    看上去好象是工厂模式的样子...
      

  6.   

    代码里当然要直接close啊,close了就是放回连接池。另外,并发多了,连接池用光了当然有问题。我记得weblogic连接池可以设定自动增加连接数的。
      

  7.   

    应该是个工厂的实现。而且自动释放是需要时间的。类似sessionDestoy()。
      

  8.   

    如果程序中的数据库访问是基于直接使用JDBC,那么在数据库操作类中就应该封装了关闭连接的代码,而不是使用者显示地调用conn.close()方法。
      

  9.   

    2 楼说的只是 JNDI 中全局的环境条目配置吧,跟 JNDI 数据源没有任何关系啊!Tomcat 中采用的 JNDI 数据源是用 Apache Commoms DBCP 连接池来实现的,
    DBCP 好像根本就没有这种功能,而且 JDBC 规范也规定在用完连接之后必须关
    闭连接,否则这个连接会一直被占用着。针对于连接池来说,调用 close() 方法
    是将连接还回到池中再重用,如果不关的话,再多的连接池也会被耗尽的。http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html如果采用 JDBC 方式的话,不管采用手工,还是统一写代码都必须得关闭数据库连接!如果用其他 ORM 框架的话,如 Hibernate, iBatis 这些工具在完成数据库操作后
    也会关闭的,只不过我们看不到而已了。
      

  10.   

    呵呵,既然你已经明白了close是还给连接池,那么很明显不调用close肯定既不会关闭也不会还给连接池,再多内存也会逐渐被耗尽。即使你设置了连接池允许的上限,也只会导致两种结果:
    1、连接池上限突破,无连接可用,抛异常
    2、连接池上限突破,仍然向内存申请空间,内存耗尽不知道楼主还有什么疑问,这个问题好像没什么深入的了
      

  11.   


    疑问就是有人说tomcat有自动回收connection机制,意思是它能智能判断你那些connection已经不用,并自动帮你回收. 我就是想知道tomcat是否有这个技术.
      

  12.   


    是这样的,个人觉得,既然是连接池,缓存原理应该是相通的,连接池会维护一定数量的连接,比如是20个(可配置),对于频繁使用超过20个的上限新创建的连接是一定会定期回收的,比如说在调用结束之后就回收,而上限之内的连接是不用回收一直维持的。Tomcat不是判断哪些Connection已经不用,而是判断Connection数量若大于Max_Limit,就会关闭并置空多余的连接楼主说的自动回收,可是这个意思?
      

  13.   

    1、
    close并未销毁connection,而是将connection还给了connection pool。2、
    connection pool在有外来请求而又没有空闲的connection时,会按占用时间顺序回收超时的connection(是按需要依次回收,而不是一次性将所有超时的connection都回收)。因此,若代码中没有close connection,可以想见,最终的结果是:connection pool将永远不会再有空闲的connenction可用,有外来请求时,要么当前没有超时的connection,外来请求被拒绝只能等待;要么等待connection pool去回收一个。所以,每次用完connection就close是最好的,甚至可以说是“应该”的。
      

  14.   

    那你连java提供的api也不要用了 java不要用了 汇编不要用了 自己写10101010吧
      

  15.   

    测试了一下,默认情况下,似乎根本不会自动回收! 就是说一定要手工close. 当然看到网上有些人说可以,实际有无这个功能就不知道了.