当我尝试在 MySQL 数据库上使用 C3P0 执行一些简单的读取 (SELECT) 操作时,会发生中断异常 (java.lang.InterruptedException)。当我将并行线程的数量增加到 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 服务器配置为接受 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)