gpt4 book ai didi

java - C3P0 线程安全吗?

转载 作者:IT老高 更新时间:2023-10-29 00:17:12 25 4
gpt4 key购买 nike

当我尝试在 MySQL 数据库上使用 C3P0 执行一些简单的读取 (SELECT) 操作时,会发生中断异常 (java.lang.InterruptedException)。当我将并行线程的数量增加到 100 以上时会发生异常(我尝试过使用 5、10、20、60 和 100)。我执行的语句很简单:

SELECT `Model.id` FROM `Model` LIMIT 100;

我的连接是从使用以下属性配置的 ComboPooledDataSource 汇集的(另请参阅 C3P0 manual):

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)

最佳答案

该警告来自大约第 2007 行 here .这似乎是一个试图获取连接的线程。

可能是因为池设置为获取比 mysql 服务器配置处理的连接更多的连接。这似乎是有道理的,作为默认 max_connection是 100(或 151,具体取决于您的 mysql 版本)

所以试图获取连接的线程进入休眠()/重试循环试图获取连接 - 但是您在该循环内关闭整个池 - 该线程被中断,因此当您关闭池时可以回收所有资源。

到目前为止,似乎没有造成任何伤害,您的代码可能会在您完成后将连接返回到池中,让它们空闲供其他人使用,并且您的所有查询都会通过。

关于java - C3P0 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com