0

复制连接主机时的一个愚蠢的错误让我指向了一个不正确的端点......这阻止了初始化过程 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, 描述 -> 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 -> false]

并且初始化在这 30 分钟内被卡住了......

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

4

2 回答 2

0

默认设置将需要大约 30 秒(而不是 30 分钟!)来检测错误的数据库:它使acquireRetryAttempts=30 延迟acquireRetryDelay=1000ms,然后得出无法获取连接的结论。如果您希望更快地检测到不良端点,请重新使用这些变量中的一个或两个。如果愿意,您可以将 acquireRetryAttempts 设置为 1,在这种情况下,任何连接获取异常都将被解释为端点问题。

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

于 2013-04-10T11:55:19.653 回答
0

问题在于 JDBC 超时配置。

如本博客所述:了解 JDBC 内部和超时配置

JDBC默认连接和socket超时为0ms,即不超时。

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

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

仍然需要根据您的需要调整所有参数,因为它们具有其他含义并且可能会破坏功能。还建议查看c3p0 论坛帖子以了解可能的配置,例如激活 breakAfterAcquireFailure。

于 2013-04-10T18:04:03.770 回答