BoneCP не восстанавливается после разрыва соединения

У меня проблема с BoneCP (0.7.1 RELEASE). Я думал что BoneCP.getConnection() гарантирует, что он вернет объект подключения, предполагая, что БД жива.

Вот как я настроил свой пул

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() возвращает хорошую связь.

Но разве это не весь смысл пула соединений, чтобы мне не приходилось самостоятельно обрабатывать случаи потери соединения?

1 ответ

Решение
  1. Он должен захватить 08S01 и уничтожить все соединения в пуле. Однако, если у вас несколько потоков, у вас может быть поток, который уже проверил соединение, которое может прерваться (остальные соединения должны снова стать ОК).

  2. Пожалуйста, попробуйте 0.8.0-бета3-SNAPSHOT; Я совсем недавно очистил эту реализацию и добавил несколько тестов надежности, тестирующих различные сценарии, среди которых 08S01.

Другие вопросы по тегам