我有一个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()
的后续调用会返回良好的连接。
但这不是连接池的一个重点,所以我不必自己处理丢失连接的情况吗?
答案 0 :(得分:4)
它应该捕获08S01并清除池中的所有连接。但是,如果您有多个线程,则可能有一个线程已经检出了可能失败的连接(其余连接应该再次变为OK)。
请试用0.8.0-beta3-SNAPSHOT;我最近清理了这个实现,并添加了一系列测试各种场景的稳健性测试,其中包括08S01。