2

将 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

这很奇怪。它绝对不会返回,也不会抛出异常。从每 5 秒运行一次的 Executors.newSingleThreadScheduledExecutor 调用 getConnection 的客户端代码。当对 getConnection 的调用似乎消失时,调度的执行线程似乎也完全停止执行。

在这种情况下,我故意关闭数据库,以便弄清楚这里发生了什么。有任何想法吗?

更新:奇怪的是,如果我不使用计划的执行程序而是在我自己的监视器线程中运行它,#getConnection 会按预期执行。

4

0 回答 0