Powtórz com.mysql.jdbc.exceptions.jdbc4.CommunicationsException za pomocą konfiguracji Spring, hibernacji i C3P0

Dostałem ten błąd z kodu produkcyjnego:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ostatni pakiet pomyślnie odebrany z serwera miał 36940 sekund temu. Ostatni pakiet wysłany pomyślnie do serwera miał 36940 sekund temu, co jest dłuższe niż wartość skonfigurowanego serwera „wait_timeout”. Przed użyciem w aplikacji należy rozważyć wygasanie i / lub testowanie poprawności połączenia, zwiększając skonfigurowane wartości serwera dla limitu czasu klienta lub używając właściwości połączenia / J 'autoReconnect = true', aby uniknąć tego problemu.

A teraz próbuję odtworzyć problem lokalnie i naprawić. Skonfigurowałem kontekst wiosny w następujący sposób:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost:3306/test?userUnicode=yes&amp;characterEncoding=UTF-8&amp"
    p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800"
    p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000"

/>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <value>
            hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            hibernate.default_schema=platform_server_original
            hibernate.show_sql=false
        </value>
    </property>
    <property name="mappingResources">
        <list>
            <value>sometables.hbm.xml</value>
        </list>
    </property>
</bean>

Następnie ustawiam mysql wait_timeout na 10 sekund, a następnie uruchamiam test, który jest w zasadzie otwarciem połączenia, wykonanie zapytania, zamknięcie go, aby powróciło do puli, a następnie uśpienie wątku na 15 sekund, a następnie ponowne otwarcie połączenia i wykonaj ponownie zapytanie, aby się zepsuło. Jednak otrzymałem podobny błąd tylko:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Błąd łącza komunikacyjnego

Ostatni pakiet wysłany na serwer był 16 ms temu.

Ciekawe, czy te dwa błędy są takie same, czy są różne? Zrobiłem kilka badań i wydaje się, że oba błędy sprowadziły się do tego samego rozwiązania: użycie właściwości „testConnectionOnCheckout = true”. Jednak według dokumentu c3p0 jest to bardzo kosztowny czek. Zaleca użycie „idleConnectionTestPeriod”, ale ustawiam to na 120 sekund. Jakiej wartości powinienem użyć, aby poprawnie zweryfikować bezczynne połączenie?

Zasadniczo więc zadaję dwie rzeczy: 1. Jak mogę odtworzyć błąd, który dostałem w kodzie produkcyjnym? 2. Jak to naprawić?

Dzięki!

questionAnswers(3)

yourAnswerToTheQuestion