自从应用系统开始使用连接池以后,Connection pool就开始流行起来。 一直有这么一种说法,使用连接池技术后,程序员毋需手动关闭连接,getConnection()之后,就不用管了,连接池会自动收回不用的连接,这也是连接池的技术优势。事实真是这样吗?
使用oc4j、Tomcat和weblogic的同志可能会发现,只要访问量大,无论在连接池中设置多少上限连接数,总会占满,总会抛异常,检查的结果也往往告诉我们是数据库连接方面出了问题;实践出真知啊,同志们,确定以下几个概念:
1、连接池即使回收Connection,也不是马上释放,而是会过一阵子才释放;
2、连接池概念本身是代为管理Connection,当我们使用close()关闭连接时,只是把该连接放回了连接池中,并没有真正的关闭这个连接;
3、Connection Pool在有外来请求,而没有空闲的Connection时,会按照时间顺序回收Connection,而不是全部回收;
看到没,第三条,这样会导致一个结果,如果connection之后,没有close,连接池会占的满满的,一直没有空闲的Connection,外来请求始终得不到响应。这就好比在餐馆排队,外面人站的腰酸腿疼,里边的人吃完了也不出来一样,可恶至极;
即使设置了连接池上限,连接后,不close也不还给连接池,再多的内存也会逐渐耗尽,这样即使设置了连接池允许的上限,也只会导致两种结果:
①连接池上限突破,无连接可用,抛异常;
②突破连接池上限,向系统申请内存,直至内存耗尽;
所以连接池不是万能的,在访问量较少的情况下,可以不用close,针对大型应用,切记,一定要close().