2

我试图从根本上导致我们的服务出现一些随机的、间歇性的“冻结”,在丢弃了几个问题之后,我们为我们的应用程序打开了 c3p0 调试级别日志记录,我们认为这似乎是一个 c3p0 配置问题。我们使用“Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production”作为我们的数据库。

日志摘录显示了作为服务调用一部分的两行。两条线之间的 3 秒内没有任何活动,我无法将其归因于任何特别的事情。

12 Apr 2013 02:25:42,386 [DEBUG] (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#8) com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool: Test of PooledConnection [com.mchange.v2.c3p0.impl.NewPooledConnection@1507a7] on CHECKIN has SUCCEEDED.

12 Apr 2013 02:25:45,443 [DEBUG] com.mchange.v2.c3p0.stmt.GooGooStatementCache: checkinStatement(): com.mchange.v2.c3p0.stmt.PerConnectionMaxOnlyStatementCache stats -- total size: 85; checked out: 0; num connections: 5; num keys: 85 

c3p0 配置如下。

acquireIncrement = 2;
acquireRetryAttempts = 0;           # keep retrying forever
acquireRetryDelay = 10000;          # 10 secs.
checkoutTimeout = 1000;             # 1 secs. 
idleConnectionTestPeriod = 60;      # 1 min.
maxConnectionAge = 1800;            # 30 mins.
maxIdleTime = 1800;                 # 30 mins.
maxIdleTimeExcessConnections = 120;
maxPoolSize = 30;
maxStatementsPerConnection = 25;
minPoolSize = 30;
initialPoolSize = 30;
numHelperThreads = 16;  # asynchronous threads
preferredTestQuery = "SELECT 1 FROM dual";
testConnectionOnCheckin = true;

我想知道是否存在导致冻结的配置问题?另外,我想知道通过设置 minPoolSize = maxPoolSize 是否会对性能产生任何影响(负面)。我找不到有答案的类似问题/问题。我不担心应用程序的启动时间,但是当连接达到“年龄”时会发生什么?我试图了解 c3p0 在处理陈旧连接时的行为。

为了了解负载,我们每分钟收到大约 300 次服务调用。CPU / 内存使用率都在合理的范围内,没有什么特别值得关注的。

任何见解将不胜感激。谢谢!-阿美亚

4

1 回答 1

0

1)minPoolSize = maxPoolSize = initialPoolSize应该没有问题,虽然它不是我测试过的配置!

2)大多数情况下你的配置看起来都不错!一些小问题:

  • acquireIncrement 为 2 意味着,在经过一段平静期后负载上升期间,大约 50% 的客户端将面临等待连接获取的一些延迟。我会让acquireIncrement 更大,从3 到5;

  • acquireRetryDelay = 10000 意味着如果任何类型的随机故障导致获取尝试失败,获取新连接的任何类型的随机失败都会导致客户端在空池上 wait() 等待 10 秒。10000 是一个很高的设置。

  • 您没有观察到显式的 APPARENT DEADLOCK 消息,但您正在使用对它们非常负责的配置,即使用 Oracle + 语句缓存。某些 Oracle 驱动程序存在一个问题,即在其父连接正在使用(例如,用于测试)时尝试 close() 缓存语句会导致冻结,最终迫使池清除并重新创建其辅助线程。您已经给自己提供了很多辅助线程,这可能有助于避免此问题,但在幕后您可能会因为线程池中的线程阻塞而遇到性能下降。c3p0-0.9.2 有一个配置参数,如果设置,i) 小心避免在父 C​​onnection 正在使用时关闭缓存的 PreparedStatements,并且 ii) 并使用专用线程关闭此类语句。我建议你试试这个。

    c3p0.statementCacheNumDeferredCloseThreads=1
    

    (您不太可能需要多个线程来关闭()语句,但如果您愿意,您可以将其设置为更大的值。请参阅此处。)

祝你好运!

于 2013-04-30T03:07:11.210 回答