Hibernate を ORM ツールとして使用する API があり、c3p0 を接続プール ハンドラーとして使用します。負荷がかかっているときは問題ありません。ただし、API が 1 日ほど非アクティブになっていると、「接続を取得できません」という例外が発生します。そのため、週末に API を使用する人がいない場合、月曜日の朝に接続エラーが発生します。
原因: java.sql.SQLException: クライアントによる接続のチェックアウトの試行がタイムアウトしました。
データベースとしてmysqlを使用しています。私の調査では、mySQL が 8 時間ほど後に接続を無効にすることがわかりました。接続プールが失効した接続をクライアントに提供しているため、クライアントの接続タイムアウト例外が発生している可能性があります。
現在、C3Po で構成されている接続テストはありません。IdleTestPeriod を使用して、プールによってクライアントに接続が提供される前に接続をテストするとします。次に、ある時点ですべての接続がテストに失敗した場合はどうなりますか? これらの失敗した接続はプールから削除され、新しいアクティブな接続が再び生成されますか?
現在、これは使用している c3p0 設定です。この問題の他の理由はありますか?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${----}"/>
<property name="jdbcUrl" value="${----}"/>
<property name="user" value="${----}"/>
<property name="password" value="${------}"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5" />
<property name="maxPoolSize" value="125" />
<property name="maxStatements" value="10" />
<property name="maxIdleTime" value="180" />
<property name="maxIdleTimeExcessConnections" value="30" />
<property name="checkoutTimeout" value="3000" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>