使用45秒空闲丢弃来管理DBCP连接

时间:2016-09-05 23:19:06

标签: mysql spring apache-commons-dbcp

我们有一个Java Web应用程序,它利用与各种数据库服务器的多个不同连接。最近,一些数据库服务器(由不同部门管理)被重新配置为位于防火墙后面,这可以减少任何45秒的空闲连接。我被告知我们可以设置一个keepAlive属性用于我们的连接。然而,经过一些研究后似乎并非如此。相反,我必须得出结论,我必须使用以下属性:

  • validationQuery
  • testOnBorrow
  • timeBetweenEvictionRunsMillis
  • 等。 (来源:Commons DBCP

缺点是我必须确保应用程序保持与这些服务器的连接,而不管另一方的45秒超时。我已经完成了一些配置并没有成功(例如:当连接断开时,连接会更快地重新建立,但仍然会很快下降)。

以下是BasicDataSource对象的原始代码:

private BasicDataSource createDefaultDataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setInitialSize(3);
    ds.setMinIdle(1);
    ds.setMaxIdle(5);
    ds.setMaxActive(100);
    ds.setMaxWait(3 * 1000);
    ds.setTimeBetweenEvictionRunsMillis(30 * 1000);
    ds.setMinEvictableIdleTimeMillis(60 * 1000);
    ds.setLogAbandoned(true);
    ds.setRemoveAbandoned(true);
    ds.setRemoveAbandonedTimeout(60);

    return ds;
}

以下是我认为的解决方案,但似乎并不像我期望的那样:

private BasicDataSource createDefaultDataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setInitialSize(3);
    ds.setMinIdle(1);
    ds.setMaxIdle(5);
    ds.setMaxActive(100);
    ds.setMaxWait(3 * 1000);
    ds.setTimeBetweenEvictionRunsMillis(15 * 1000); // was 30 seconds
    ds.setMinEvictableIdleTimeMillis(30 * 1000);  // was 60 seconds
    ds.setLogAbandoned(true);
    ds.setRemoveAbandoned(true);
    ds.setRemoveAbandonedTimeout(60);

    ds.setValidationQuery("select 1");
    ds.setTestOnBorrow(true);
    ds.setTestOnReturn(true);
    ds.setTestWhileIdle(true);

    return ds;
}

也许我的时机已关闭,或许还有其他属性需要与这些相关联,或者我应该以不同的方式进行此操作。

应该设置/更改哪些属性以弥补45秒的空闲丢弃策略?

0 个答案:

没有答案