我也遇到了这个情况,不是简单增加连接池数量就能解决的, 大家都觉得使用连接池可以使连接更好的控制,于是乎简单的配置了一下连接池就行了,只要能连接到数据库就觉得什么都ok了。
其实不然,如果不正确的配置一下连接池,那将得不偿失。原因是:连接池的确会减少每次连接数据库对系统带来的开销,因为连接池中会存在一些可用的连接,程序使用的时候直接来这里取就行了,连接池中的连接一般情况下是不会被关闭的,这点就是问题的所在。这么多的没关闭连接会直接耗掉数据库所能提供的连接数。
这和直接使用程序去连接而忘了关闭连接是一样的效果。甚至更为严重(因为连接池中的连接会不停的被发sql去test而不会过时,程序中的连接会超时)。
所以以后使用连接池时,一定要记得配置超时选项,而不是简单的配置一下最大数和最小数就行了。大多数连接池都有一个配置池中超时连接的选项,比如dpcp的maxWait,proxool的maximum-connection-lifetime,jboss自带连接池的IdleTimeoutMinutes等,但是它们默认都是0过-1L。
也就是说,默认情况下,连接池中的连接是不会超时的。这点很重要:池中的连接永远保持着与数据库的连接。。当使用完这些连接后如果再有其它外来连接想使用数据库的话,数据库就再没有可用的连接可以提供了。