Является ли C3P0 потокобезопасным?

Исключение прерывания (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)

12
задан Pantelis Sopasakis 22 February 2011 в 09:56
поделиться