2013-04-30 268 views
2

我试图在我们的服务中导致一些随机的,间歇性的“冻结”,并且在放弃几个问题后,我们为应用程序启用了c3p0调试级别日志记录,并且我们认为它看起来像是c3p0配置问题。我们使用“Oracle数据库11g企业版版本11.2.0.3.0 - 64位生产”作为我们的数据库。c3p0 - 任何问题设置initialPoolSize = minPoolSize = maxPoolSize?

从日志摘录显示两行是服务调用的一部分。这两条线之间没有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 [[email protected]] 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 /内存使用率都在合理的水平内,没有什么特别感兴趣的。

任何见解将不胜感激。 谢谢! -Ameya

回答

0

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

2)主要是你的配置看起来不错!几个狡辩:

  • 的2 acquireIncrement意味着,在一些平静期后上升负载期间,客户端的约50%将面临一些延迟等待连接采集。我会使收益增加3到5;

  • acquireRetryDelay = 10000表示如果任何一种随机毛刺导致采集尝试失败,任何形式的获取新连接的随机故障都将导致客户端在空闲池中等待10秒钟。 10000是一个很高的设置。

  • 你并没有注意到显式的APPARENT DEADLOCK消息,但是你正在使用Oracle +语句高速缓存对他们负责的配置。有些Oracle驱动程序存在一个问题,那就是在尝试关闭()一个缓存Statement时,如果它的父Connection正在使用(例如,用于测试)导致冻结,最终迫使该池清除并重新创建其帮助程序线程。您已经给自己提供了很多帮助线程,这可能有助于避免此问题,但是在封面之下,您可能会因线程池中的线程堵塞而导致性能受损。 c3p0-0.9.2有一个配置参数,如果设置的话,i)在父连接正在使用时小心避免关闭缓存的PreparedStatements,ii)使用专用线程关闭这些语句。我建议你试试这个。请升级,如果你还没有准备好,到c3p0-0.9.2.1并设置

    c3p0.statementCacheNumDeferredCloseThreads=1 
    

    (这是不太可能,你会需要一个以上的线程只是关闭()语句,但你可以设置为较大的值如果您愿意,请参阅here。)

祝你好运!

+0

非常感谢!我将做必要的改变。 – 2013-04-30 14:39:45