4

我对 BoneCP (0.7.1 RELEASE) 有疑问。我虽然BoneCP.getConnection()确保它会返回 Connection 对象假设 DB 是活动的。

这是我配置我的池的方式

private void setupConnectionPool() throws SQLException
{
    // setup the connection pool
    String connectUri = "jdbc:mysql://master-mysql:3306/base?zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&useCompression=true";

    BoneCPConfig config = new BoneCPConfig();
    config.setJdbcUrl(connectUri);
    config.setUsername("dbapp");
    config.setPassword("meh");
    config.setMinConnectionsPerPartition(5);
    config.setMaxConnectionsPerPartition(10);
    config.setPartitionCount(1);
    config.setConnectionTimeoutInMs(5 * 1000);

    this.connectionPool = new BoneCP(config); // setup the connection pool
}

然后在代码的某个地方我像这样使用它

    // I'm using Apache DbUtils
    QueryRunner run = new QueryRunner();
    Object result = run.query(this.connectionPool.getConnection(), query, handler, start, limit);

尝试运行此查询会引发SQLException状态08S01(通信链接故障)。

随后调用this.connectionPool.getConnection()返回良好的连接。

但这不是连接池的一个完整点,这样我就不必自己处理丢失连接的情况了吗?

4

1 回答 1

4
  1. 它应该捕获 08S01 并清除池中的所有连接。但是,如果您有多个线程,则可能有一个线程已经签出了可能失败的连接(其余连接应该再次恢复正常)。

  2. 请试用 0.8.0-beta3-SNAPSHOT;我最近清理了那个实现,并添加了一堆健壮性测试来测试各种场景,其中包括 08S01。

于 2012-11-30T21:28:56.783 回答