我们目前正在迁移应用程序以在Liberty服务器上运行(8.5.5.9)。我们发现应用服务器和数据库之间的连接有时会被防火墙终止,因为它们会长时间处于空闲状态。发生这种情况时,在下一个HTTP请求中,应用程序将收到其中一个断开的连接。
以前,我们一直使用Apache Commons DBCP来管理连接池。其中一个configuration parameters in a DBCP conneciton pool是" testOnBorrow",它会阻止应用程序被传递给其中一个错误的连接。
Liberty管理的数据源中是否有这样的配置参数?
到目前为止,我们已经配置了这样的数据源:
<dataSource jndiName="jdbc/ora" type="javax.sql.DataSource">
<properties.oracle
user="example" password="{xor}AbCdEfGh123="
URL="jdbc:oracle:thin:@example.com:1521:mydb"
/>
<connectionManager
minPoolSize="3" maxPoolSize="10" maxIdleTime="10m"
purgePolicy="ValidateAllConnections"
/>
<jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/>
</dataSource>
purgePolicy当前设置为在发现一个坏连接时验证所有连接(例如,当所有连接长时间处于空闲状态时过夜)。但所有这一切都可以防止多个不良连接被顺序传递给应用程序。
connectionManager中的一个选项是设置agingTimout =&#34; 20m&#34;自动删除已经过防火墙终止的连接。但是,这也会终止最近使用的连接(这会阻止防火墙破坏它们)。
我错过了一些明显的东西吗? 谢谢!
答案 0 :(得分:2)
在这种情况下,我会建议您使用已经使用的maxIdleTime
,但将minPoolSize
减少为0(或删除它,因为默认值为0)。
根据maxIdleTime
doc:
maxIdleTime :在池维护期间可以丢弃未使用或空闲连接的时间,如果这样做不会将池减少到最小值以下。
由于您拥有minPoolSize=3
,如果池中只有3个不良连接,则游泳池维护不会启动,因为维护线程不会赢得#t}根据文档将池大小设置为低于最小值。因此,设置minPoolSize=0
应允许maxIdleTime
清除所有不良连接,就像您在此方案中所期望的那样。
所以这是我建议你的最终配置:
<dataSource jndiName="jdbc/ora" type="javax.sql.DataSource">
<properties.oracle user="example" password="{xor}AbCdEfGh123="
URL="jdbc:oracle:thin:@example.com:1521:mydb"/>
<connectionManager maxPoolSize="10" maxIdleTime="18m"/>
<jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/>
</dataSource>
maxIdleTime
的值假定您的防火墙在20分钟后终止连接,并在18分钟后触发清理,以便为清理线程提供2分钟的窗口来清理即将到来的糟糕的关系。