我现在的项目使用Tomcat 连接池连接数据库,要求每次连接数据库后,必须手工执行connection.close()来关闭连接,但,最近看到一些人说,tomcat本身具体回收connection机制,它会把你不用的connection回收. 如果真的是这样,开发人员就不必每次都手工执行connection.close(),免去不少麻烦.
我的问题是,tomcat是否真的具有自动回收connection机制? 有没有人试过不用执行connection.close(),但系统能正常运行的?
我的问题是,tomcat是否真的具有自动回收connection机制? 有没有人试过不用执行connection.close(),但系统能正常运行的?
我用的是weblogic连接池,估计两者的原理差不多,我设置它的初始化连接数为200,
平常运行不会出问题,但是访问量达到一定的数量就会出问题,数据库的连接实例全被用光,
导致系统直接挂掉,后来使用手动释放连接就没事了。如果访问量不高,不写应该问题不大吧,我也没做过实验,但是根据我的实际应用,应该问题不大。
我那个程序白天的访问量大概是1000次/分钟
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>
配置。
当你调用从连接池获得的Connection的close()方法时候,实际上它只是被换给连接池,并不会真正关闭这就是连接缓存的概念证明很简单,你拿到Connection,setReadOnly(true),用完close()
不就之后你会发现获得的连接无法进行update/insert/delete,原因就是这些连接正是被缓存起来被你上次调用查询时setReadOnly过的同一个对象
看这样就足够了?看去看好象还有东西没说. simpleValue 是什么值,固定的吗? value="30" 有什么用呢?
这样就足够了?好象还有东西没说. simpleValue 是什么值,固定的吗? value="30" 有什么用呢?
看上去好象是工厂模式的样子...
DBCP 好像根本就没有这种功能,而且 JDBC 规范也规定在用完连接之后必须关
闭连接,否则这个连接会一直被占用着。针对于连接池来说,调用 close() 方法
是将连接还回到池中再重用,如果不关的话,再多的连接池也会被耗尽的。http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html如果采用 JDBC 方式的话,不管采用手工,还是统一写代码都必须得关闭数据库连接!如果用其他 ORM 框架的话,如 Hibernate, iBatis 这些工具在完成数据库操作后
也会关闭的,只不过我们看不到而已了。
1、连接池上限突破,无连接可用,抛异常
2、连接池上限突破,仍然向内存申请空间,内存耗尽不知道楼主还有什么疑问,这个问题好像没什么深入的了
疑问就是有人说tomcat有自动回收connection机制,意思是它能智能判断你那些connection已经不用,并自动帮你回收. 我就是想知道tomcat是否有这个技术.
是这样的,个人觉得,既然是连接池,缓存原理应该是相通的,连接池会维护一定数量的连接,比如是20个(可配置),对于频繁使用超过20个的上限新创建的连接是一定会定期回收的,比如说在调用结束之后就回收,而上限之内的连接是不用回收一直维持的。Tomcat不是判断哪些Connection已经不用,而是判断Connection数量若大于Max_Limit,就会关闭并置空多余的连接楼主说的自动回收,可是这个意思?
close并未销毁connection,而是将connection还给了connection pool。2、
connection pool在有外来请求而又没有空闲的connection时,会按占用时间顺序回收超时的connection(是按需要依次回收,而不是一次性将所有超时的connection都回收)。因此,若代码中没有close connection,可以想见,最终的结果是:connection pool将永远不会再有空闲的connenction可用,有外来请求时,要么当前没有超时的connection,外来请求被拒绝只能等待;要么等待connection pool去回收一个。所以,每次用完connection就close是最好的,甚至可以说是“应该”的。