如何使用C3P0池和JDBC检测数据库的错误端点

时间:2013-04-10 10:43:23

标签: mysql jdbc c3p0

复制连接主机时的一个愚蠢的错误让我指向一个不正确的端点......这阻止了初始化过程30分钟......

最后是例外:

  • 收购尝试失败!!!清除待处理的收购。在尝试获取所需的新资源时,我们未能成功超过允许的最大获取次数(30)。

尝试重现错误我只需使用以下连接字符串指向google.es

JDBC:MySQL的://google.es/myDB

初始化c3p0池... com.mchange.v2.c3p0.ComboPooledDataSource [acquireIncrement - > 1,acquireRetryAttempts - > 30,acquireRetryDelay - > 1000,autoCommitOnClose - > false,automaticTestTable - > null,breakAfterAcquireFailure - > false,checkoutTimeout - > 0,connectionCustomizerClassName - > null,connectionTesterClassName - > com.mchange.v2.c3p0.impl.DefaultConnectionTester,dataSourceName - > 1hgeksr8t1vk3sn21ui8jk0 | 53689fd0,debugUnreturnedConnectionStackTraces - > false,description - > null,driverClass - > com.mysql.jdbc.Driver,factoryClassLocation - > null,forceIgnoreUnresolvedTransactions - > false,identityToken - > 1hgeksr8t1vk3sn21ui8jk0 | 53689fd0,idleConnectionTestPeriod - > 0,initialPoolSize - > 3,jdbcUrl - > jdbc:mysql://google.es/myDB,maxAdministrativeTaskTime - > 0,maxConnectionAge - > 0,maxIdleTime - > 3600,maxIdleTimeExcessConnections - > 300,maxPoolSize - > 5,maxStatements - > 0,maxStatementsPerConnection - > 0,minPoolSize - > 1,numHelperThreads - > 3,preferredTestQuery - > null,properties - > {user = * ,密码= * },propertyCycle - > 0,statementCacheNumDeferredCloseThreads - > 0,testConnectionOnCheckin - > false,testConnectionOnCheckout - > false,unreturnedConnectionTimeout - > 0,userOverrides - > {},usesTraditionalReflectiveProxies - >错误的]

并且那些30多分钟的初始化被卡住了......

我希望它能更快地抛出异常,但我不确定应该触摸哪些配置值:c3p0 acquireRetryAttempts?还是jdbc socketTimeout?并且最重要的是如果我改变它可能会破坏...

2 个答案:

答案 0 :(得分:0)

默认设置将花费大约30秒(而不是30分钟!)来检测错误的数据库:它会使acquireRetryAttempts = 30,延迟为acquireRetryDelay = 1000ms,然后才能断定无法获取Connection。如果您希望更快地检测到坏端点,请记录其中一个或两个变量。如果您愿意,可以将acquireRetryAttempts设置为1,在这种情况下,任何连接获取异常都将被解释为端点问题。

请参阅http://www.mchange.com/projects/c3p0/#configuring_recovery

答案 1 :(得分:0)

问题在于JDBC超时配置。

正如此博客中所述:Understanding JDBC Internals & Timeout Configuration

对于连接和套接字超时,JDBC默认为0ms,即没有超时。

如果目标端点存在但没有应答(数据包可能被防火墙吞没)连接仍然被困,并且仅在一分钟之后(为什么一分钟?仍然是一个谜)c3p0尝试连接重试...因此异常出现太久了...

解决方案在于将connectTimeout = XXXms添加到JDBC(可以作为参数传递:mysql://google.es/myDB?connectTimeout = 1000)并在一分钟后(30秒尝试1秒,超时1秒)对于重试延迟)异常发生......

仍然需要根据您的需要调整所有参数,因为它们具有其他含义并可能会破坏功能。还建议检查c3p0 forum thread有关可能的配置,例如激活breakAfterAcquireFailure。