Пул соединений не смог подключиться к потоку
Я использую GreenDAO для обработки базы данных в Android. При выполнении многих изменений базы данных ( > 15.000) я получаю сообщение об ошибке:
Пул соединений для базы данных '/data/data/...' не смог предоставить соединение с потоком 312 (Thread-312) с флагами 0x1 в течение 30.000002 секунд.
Все застревает. Почему происходит эта ошибка?
Ответы
Ответ 1
Я не могу точно сказать об этой конкретной реализации, но есть соединение, обычно поддерживающее ORM. Пул соединений открывает определенное количество подключений к базе данных и перерабатывает их по мере их закрытия и открывает новые соединения. Эта ошибка говорит вам, что она, вероятно, превзошла предел. Это может произойти по целому ряду причин: один из них состоит в том, что, возможно, в БД есть какой-то тупик, потому что вы обновляете две таблицы, а две разные транзакции содержат разные таблицы, ожидающие выхода другого. Или просто, что слишком много открытых подключений, и пул DB или пулов просто запутывается.
Извините, что на самом деле это не ответ, но вам нужно посмотреть документы для GreenDAO, чтобы посмотреть, как это может произойти.
Ответ 2
Я получил это сообщение, когда хочу выбрать запрос в таблице, который используется для транзакции без завершения транзакции раньше. Проблема решена при выполнении endTransaction()
по окончательному блоку транзакции.
Ответ 3
Я получил это сообщение при создании слишком большого количества соединений с SQLite через DBFlow FlowQueryList. Мое решение состояло в том, чтобы убедиться, что как только вы закончили с списком запросов для вызова endTransactionAndNotify()
, а затем close()
в списке запросов.
Только вызов endTransactionAndNotify()
не помог.
Надеюсь, это поможет, эта тема, конечно, помогла мне.