报错内容:commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
在我的程序中多线程从数据库连接池中拿连接对象时,出现这个错误。翻译成中文就是,无法获得连接对象,数据池出现错误,等待空闲对象超时。
解决办法
等待空闲的连接对象超时,那么可以考虑两种解决办法,将等待空闲连接对象的等待时间加长,允许程序更长的等待时间而避免错误。另一种办法就是设法增加连接池中可用的连接对象,避免程序在获取连接对象时陷入等待的境地。
其实第一种方法只能暂时避免报错信息,第二种办法才是解决问题的有效办法,尤其多线程获取数据池连接对象的情况下,应该尽量将活跃连接对象数量大于等于活跃线程的数量,从而保证连接对象足够充裕。
以下是数据池相关参数的配置信息。
maxActive 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接。设 0 为没有限制。
maxIdle 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒,这里取值-1,表示无限等待,直到超时为止,也可取值9000,表示9秒后超时。超过时间会出错误信息一般把maxActive设置成可能的并发量就行了
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每
timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止
minEvictableIdleTimeMillis 连接池中连接可空闲的时间,毫秒
removeAbandoned true,false,是否清理removeAbandonedTimeout秒没有使用的活动连接,清理后并没有放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true,false,连接池收回空闲的活动连接时是否打印消息
minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样,minEvictableIdleTimeMillis针对连接池中的连接对象,removeAbandonedTimeout针对未被close的活动连接。