在WAS Liberty连接池中,我可以验证借用的连接吗?

时间:2016-07-19 18:36:46

标签: datasource websphere-liberty

我们目前正在迁移应用程序以在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;自动删除已经过防火墙终止的连接。但是,这也会终止最近使用的连接(这会阻止防火墙破坏它们)。

我错过了一些明显的东西吗? 谢谢!

1 个答案:

答案 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分钟的窗口来清理即将到来的糟糕的关系。