复制连接主机时的一个愚蠢的错误让我指向一个不正确的端点......这阻止了初始化过程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?并且最重要的是如果我改变它可能会破坏...
答案 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。