Исключение прерывания (java.lang.InterruptedException) возникает, когда я пытаюсь выполнить некоторые простые операции чтения (SELECT) с использованием C3P0 в базе данных MySQL. Исключение возникает, когда я увеличиваю количество параллельных потоков более 100 (я пробовал с 5,10,20,60 и 100). Выполняемый мной оператор очень прост:
SELECT `Model.id` FROM `Model` LIMIT 100;
Мои соединения объединены в пул из ComboPooledDataSource, который настроен с использованием следующих свойств (см. Также руководство C3P0 ):
c3p0.jdbcUrl=jdbc:mysql...
c3p0.debugUnreturnedConnectionStackTraces=true
c3p0.maxIdleTime=5
c3p0.maxPoolSize=1000
c3p0.minPoolSize=5
c3p0.initialPoolSize=5
c3p0.acquireIncrement=3
c3p0.acquireRetryAttempts=50
c3p0.numHelperThreads=20
c3p0.checkoutTimeout=0
c3p0.testConnectionOnCheckin=true
c3p0.testConnectionOnCheckout=true
user=***
password=***
Сервер MySQL на машине I Запуск тестов настроен на прием 1024 соединений, и модульные тесты, которые я запускаю, успешно выполняются (данные извлекаются из базы данных, как и ожидалось). Однако в файле журнала C3P0 Я обнаружил следующее предупреждение:
15:36:11,449 WARN BasicResourcePool:1876 - com.mchange.v2.resourcepool.BasicResourcePool@9ba6076 -- Thread unexpectedly interrupted while performing an acquisition attempt.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Я хотел бы знать причину этого предупреждения и, во-вторых, его возможное влияние на надежность и стабильность программного обеспечения. Обратите внимание, что после использования я закрываю набор результатов, оператор SQL и соединение. Наконец, по завершении теста я закрываю пул, вызывая метод ComboPooledDataSource # close ()
. Что еще более странно (и, похоже, выявляет проблему синхронизации), так это то, что если я выделю достаточно времени пулу, используя следующее ...
Thread.sleep(10000); // wait for some time
datasource.close();
Никаких предупреждений в журналах не появится! Считаете ли вы, что это вызывает проблему безопасности потоков для C3P0, или я делаю что-то не так?
Обновление 1:
Позвольте мне упомянуть, что удаление Thread.sleep (10000)
, кроме то, что уже упоминалось, приводит к тому, что в файл журнала MySQL регистрируется следующая информация:
110221 14:57:13 [Warning] Aborted connection 9762 to db: 'myDatabase' user: 'root'
host: 'localhost' (Got an error reading communication packets)
Может пролить еще немного света ...
Обновление 2:
Вот моя конфигурация сервера MySQL. Количество максимально разрешенных соединений на сервере установлено на 1024 (как я уже упоминал выше), что достаточно для того, что я пытаюсь сделать.
[mysqld]
max_allowed_packet = 64M
thread_concurrency = 8
thread_cache_size = 8
thread_stack = 192K
query_cache_size = 0
query_cache_type = 0
max_connections = 1024
back_log = 50
innodb_thread_concurrency = 6
innodb_lock_wait_timeout = 120
log_warnings
Чтобы скрыть любые сомнения, я проверил, что максимальное количество подключений правильно установлено следующим образом:
show global variables where Variable_name='max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1024 |
+-----------------+-------+
1 row in set (0.00 sec)