我在tomcat 7.0.42上使用tomcat DBCP和Oracle数据库。以下是我的资源定义示例:
<Resource name="jdbc/DB_alias1"
auth="Container"
type="javax.sql.DataSource"
fairQueue="true"
username="user"
password="password"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@(...)"
timeBetweenEvictionRunsMillis="180000"
minEvictableIdleTimeMillis="120000"
maxActive="50"
maxIdle="4"
minIdle="4"
maxWait="10000"
initialSize="4"
initSQL="<A valid init SQL>"
validationQuery="SELECT 1 from dual"
validationInterval="60000"
testOnBorrow="false"
testOnReturn="false"
testWhileIdle="true"
removeAbandonedTimeout="120"
removeAbandoned="true"
logAbandoned="false"
/>
启动时会创建4个初始连接。根据上述配置,在minEvictableIdleTimeMillis
之后,所有空闲连接都应该有资格被回收/销毁。
由于我有4个空闲连接,因此我希望每timeBetweenEvictionRunsMillis
秒回收/销毁这4个连接,并使用新的登录时间创建4个新连接。在检查数据库中的连接时,我看到登录时间与创建初始连接时保持一致,即使在一两天之后也永远不会更新。如果DB中的数据发生任何变化,这些陈旧的连接会提供不正确的结果。
Apache commons DBCP不是这种情况,其中连接是根据timeBetweenEvictionRunsMillis
自动回收的。
我尝试在此论坛上搜索有关解决方案的提示,但到目前为止还没有任何工作。我想知道我是否可能没有正确完成配置。任何见解将不胜感激。
谢谢!
答案 0 :(得分:1)
由于我有4个minIdle连接,所以我希望这4个连接每次都可以循环/销毁,只能在EvictionRunsMillis秒之间
没有。恰恰相反。 minIdle = 4表示允许四个连接保留在池中,即使它们处于空闲状态(事实上,如果需要,池甚至会增长以保持四个空闲连接)。
如果数据库中的数据发生任何变化,这些陈旧的连接会提供不正确的结果。
无论何时创建连接,都不应该发生这种情况。
即使连接是在几天前创建的,连接也会发出新的查询。除非你有一些非常奇怪的缓存。
空闲连接可能发生的情况是它们超时并断开连接。但是这应该由validationQuery来处理。