while (true) {
Runnable myTask;
synchronized ( ThreadPoolAsynchronousRunner.this ) {
while ( !should_stop && pendingTasks.size() == 0 )
ThreadPoolAsynchronousRunner.this.wait( POLL_FOR_STOP_INTERVAL ); // <- here
if (should_stop) ...
Очень похоже, что все потоки простаивают. Они ждут работы. 0 активных потоков и только 1 задача для завершения. Любые подсказки о том, что происходит не так?
У меня только что возникла аналогичная проблема с базой данных Oracle, но в моем случае счетчики Managed Thread и Active Thread были одинаковыми.
Managed Threads: 3
Active Threads: 3
Для меня на самом деле это была ошибка аутентификации, но она отображалась как ошибка APPARENT DEADLOCK из-за того, как я проводил аудит входа в систему.
Это похоже на то, что вы уже получили соединение из пула и не возвращаете его вовремя.
C3P0 определяет "очевидные взаимоблокировки", когда соединение устанавливается, но не возвращается в пул в течение времени ожидания обнаружения взаимоблокировки.
Если переместить получение соединения ближе к "действию" и сразу же вернуть его в пул после завершения работы с базой данных, это сообщение исчезнет.
Ответ 3 · рейтинг 4 · ChristiaanP
Это решит вашу проблему
ds.setMaxStatements(1000);
ds.setMaxStatementsPerConnection(100); (the maximum number of prepared statments your system can execute on a single connection)
Я получил эту ошибку, потому что не смог пройти через брандмауэр к серверу базы данных. Проверьте, не является ли это вашей проблемой.
Ответ 5 · рейтинг 1 · Steve T
@eebbesen, у меня такая же ошибка, как и у тебя. Я использую Tomcat версии 9.0.6. У меня есть спящий режим версии 5.2.10, спящий режим c3p0 версии 3.6.3 в моем проекте maven. Моя была не ошибкой аутентификации, а скорее из-за того, что я ранее изменил имя своего компьютера. Это не оказало немедленного влияния на tomcat, но после перезагрузки моей машины, когда я попытался снова запустить tomcat через eclipse (Oxygen 2), я больше не мог запустить eclipse именно из-за поднятой вами проблемы.
Я погуглил это и нашел эту ссылку, которая подсказала мне проблему:
https://community.oracle.com/thread/339825
где сказано:
Сначала проверьте, запущены ли службы OracleServiceXE и OracleXETNSListener. Замените 127.0.0.1 в URL-адресе на IP-адрес или имя вашей машины. Он должен совпадать с хостом, объявленным в файле tnsnames.ora.
Позже упоминается, где найти этот файл tnsnames.ora, и для меня это было здесь:
Но недавно я переименовал свою машину в MyMachineName-5. Я изменил 7 на 5 и сохранил файл. Я проверил файл "listener.ora" в этом каталоге, и у него была такая же проблема:
Затем я открыл диспетчер задач, щелкнул вкладку "Службы" и посмотрел службы "Oracle". Я перезапустил: OracleXETNSListener, OracleXEClrAgent, OracleServiceXE. Я снова пошел перезапускать tomcat в eclipse, и на этот раз возникла проблема.
Приложение:
Я также погуглил это:
https://community.oracle.com/thread/2267906
Это заставило меня попробовать:
1) Отключил брандмауэр в Защитнике Windows (уже отключил брандмауэр mcaffee)
2) Запустил sqlplus, чтобы убедиться, что я могу войти в систему с учетными данными, которые я использовал в своем файле гибернации: hibernate.cfg.xml
3) Запустил ярлык на рабочем столе для Oracle Database 11g
Это не помогло мне даже после того, как я исправил проблему с именем машины, что мне все еще нужно изучить.
4) Используя dbVisualizer, я попытался подключиться к Oracle. Это сработало только после того, как я решил проблему с именем файла .ora: дважды щелкните соединение и нажмите кнопку "ping server".
Ответ 6 · atzu
У меня была та же проблема, но причину было немного трудно определить, поскольку она была вызвана тем, что некоторые одновременные ресурсы пытались одновременно установить соединение.
Как вы можете прочитать, если пул не был инициализирован, код, предоставленный для его инициализации, вызывает функцию настройки.
public Connection getConnection() throws SQLException {
if (mCPDS == null) {
setupPool();
}
return mCPDS.getConnection();
}
Проблема заключалась в том, что многие ресурсы пытались получить соединение в начале программы, поэтому более одного экземпляра пула создавали через некоторое время, вызывая вашу проблему.
Решение состояло в том, чтобы просто объявить метод синхронизированным, чтобы не допустить других ресурсов, пока кто-то вызывает метод, и он все еще находится внутри экземпляра пула, например.
public synchronized Connection getConnection() throws SQLException {
if (mCPDS == null) {
setupPool();
}
return mCPDS.getConnection();
}
Это может быть ошибкой дизайна из-за того, что не используется синглтон, но это устраняет проблему, связанную с отсутствием некоторой производительности.
Ответ 7 · Zon
У меня была такая же (не удалось обнаружить) проблема, решенная путем правильного закрытия экземпляров Statement и Resultset (каким-то образом оставленных незакрытыми):
Привет, мой друг, просто чтобы прокомментировать, у меня был такой же случай. Я только что настроил свой проект eclipse spring-hibernate и обнаружил то же исключение, следует отметить, что в моем проекте до сих пор нет запроса.
Я решил эту проблему с помощью следующих шагов:
1) Очистить проект: Проект--> Очистить... 2) Построить проект: Проект--> Построить проект
Я надеюсь, что это работает для вас.
Ответ 9 · Leviand
У меня внезапно возникла та же проблема: после того, как я заметил, что тупик присутствует только при запуске моего приложения в режиме отладки (я использую IntelliJ), и все было в порядке при обычном запуске, я начал его копать.
Наконец-то я понял, что точка останова блокировала соединение: я не знаю, почему Intellij не "слушал", что приложение проходит через эту точку останова, но где-то зависал из-за точки останова, и это вызывало очевидный тупик
После удаления всех точек останова в моем проекте все снова пошло гладко.
Надеюсь, это поможет кому-то
Ответ 10 · рейтинг -1 · colin
Мы столкнулись с этой проблемой и решили ее, добавив это в конфигурацию C3P0:
Аналогичная проблема возникла на сервере Glassfish4 при развертывании приложения. Оказалось, что это была проблема с конфигурацией базы данных. Просто убедитесь, что ваша конфигурация подключения к базе данных верна, убедитесь, что имя хоста, указанное в конфигурации, разрешает подключение к базе данных. Попробуйте подключиться к базе данных вручную с настроенным именем пользователя и именем хоста/доменом. При необходимости разрешите пользователю db подключаться из нужного домена. Перестройте приложение с правильными конфигурациями базы данных, а затем разверните его.