使用c3p0作为我的连接池,在连接池耗尽其重试次数后,调用c3p0的线程似乎被终止或处于未定义状态。
连接池定义如下:
private val pool = new ComboPooledDataSource
pool.setDriverClass(config("database.driverClass").as[String])
pool.setJdbcUrl(config("database.jdbcUrl").as[String])
pool.setUser(config("database.user").as[String])
pool.setPassword(config("database.password").as[String])
pool.setAcquireRetryAttempts(5)
客户端代码调用getConnection,它会在c3p0通过连接重试尝试旋转时短暂阻塞。奇怪的是,它似乎并没有从这个电话回来。从文档中,我预计会抛出异常:
If all attempts fail, any clients waiting for Connections from the
DataSource will see an Exception, indicating that a Connection
could not be acquired
这很奇怪。它绝对不会返回,并且它不会抛出异常。从Executors.newSingleThreadScheduledExecutor调用getConnection的客户端代码每隔5秒运行一次。当对getConnection的调用似乎消失时,预定的执行程序线程似乎也停止执行。
在这种情况下,我故意将数据库关闭,以便我可以弄清楚这里发生了什么。有什么想法吗?
更新:奇怪的是,如果我不使用预定的执行程序而是在我自己的监视器线程中运行它,那么#getConnection将按预期执行。