接続プールに 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 は期待どおりに動作します。