Czas oczekiwania na połączenie upływa po okresie bezczynności

Mamy api, które używa hibernacji jako narzędzia ORM i używamy c3p0 jako procedury obsługi puli połączeń. Nie mamy problemów, gdy jesteśmy pod obciążeniem. Jednak kończą się wyjątki „nie można uzyskać połączenia”, gdy api jest nieaktywne przez około dzień. Jeśli więc w ciągu weekendu żadne ciało nie używa api, otrzymujemy błędy połączenia w poniedziałek rano.

Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

Używamy mysql jako bazy danych. Podczas moich badań dowiedziałem się, że mySQL sprawia, że ​​połączenia są przestarzałe po około 8 godzinach. Możliwe, że pula połączeń wydaje nieaktualne połączenie z klientem, a tym samym wyjątki limitu czasu połączenia dla klienta.

Obecnie nie mamy żadnych testów połączeń skonfigurowanych w C3Po. Powiedzmy, jeśli użyję IdleTestPeriod do przetestowania połączenia, zanim zostaną one podane do klienta przez pulę. Co się stanie, jeśli wszystkie moje połączenia nie zdadzą testu w danym momencie? Czy te nieudane połączenia zostaną usunięte z puli i ponownie wygenerowane zostaną nowe aktywne połączenia?

Obecnie są to ustawienia c3p0, których używamy. Jakieś inne możliwe przyczyny tego problemu?

<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>

Dzięki za pomoc

questionAnswers(2)

yourAnswerToTheQuestion