2012-06-22 10 views
5

Mamy webappa działającą w Hibernate/C3PO 4.1.4.Final, Jetty, Java 6 i Mysql 5.1.63.MySQL/Hibernate losowo ma "Błąd łącza komunikacyjnego"

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: link Komunikacja awaria

Ostatni pakiet odebrany z serwera było 238,519 milisekund temu. Ostatni pakiet wysłany pomyślnie na serwer był 0 milisekund temu.

sekcja właściwości naszej persistence.xml wygląda tak ...

<properties> 
     <property name="hibernate.show_sql" value="false"/> 
     <!--Begin Credentials --> 
     <property name="hibernate.connection.url" 
        value="${rp.config.db.url}&amp;useUnicode=true&amp;characterEncoding=UTF-8"/> 
     <property name="hibernate.connection.username" value="${rp.config.db.user}"/> 
     <property name="hibernate.connection.password" value="${rp.config.db.password}"/> 
     <!--End Credentials --> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.dialect" value="com.printlogix.rp.server.utils.Mysql5BitBooleanDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="validate"/> 
     <!--C3PO --> 
     <property name="hibernate.connection.provider_class" 
        value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider"/> 
     <property name="hibernate.c3p0.acquire_increment" value="25"/> 
     <property name="hibernate.c3p0.idle_test_period" value="60"/> 
     <property name="hibernate.c3p0.timeout" value="120"/> 
     <property name="hibernate.c3p0.max_size" value="150"/> 
     <property name="hibernate.c3p0.min_size" value="25"/> 
     <property name="hibernate.c3p0.max_statement" value="0"/> 
     <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/> 

    </properties> 

Nasz czas oczekiwania na MySQL jest ustawiony na 600 sekund. Nie mamy pojęcia, jak to się dzieje 1/5 razy. Serwer ma bardzo małe obciążenie, baza danych jest stosunkowo mała, serwlety działają w ciągu kilku sekund.

Ktoś ma jakieś pomysły?

+0

Czy występują problemy z komunikacją między komputerami obsługującymi Jetty i MySQL? Jakiś firewall? –

+0

jakie transakcje robisz, aby spowodować taki przypadek? Jak długo to trwa? Jeśli trwają dłużej niż limit czasu MySQL, spróbuj przerwać transakcję na wiele transakcji wsadowych. Źródła: Byłem tam, zrobiłem to (jeśli tak to opisałem :)) –

+0

Po pierwsze, czy twój mysql działa? i czy ten parametr wskazuje poprawny adres url -rp.config.db.url? – Chan

Odpowiedz

0

Ten sam problem wystąpił również na serwerze produkcyjnym. Domyślnie MySQL resetuje połączenia co 8 godzin, a więc otrzymujemy komunikat o błędzie prawie co 8 godzin, ponieważ stale uzyskiwaliśmy dostęp do bazy danych z zaplanowanymi zadaniami. Rozwiązaliśmy to, zwiększając "wait_timeout" do 14 dni, a ponieważ nasza konserwacja jest planowana co 15 dni, restartujemy każdy serwer MySQL to nasz klaster DB (Mamy replikację Master-Master na miejscu). Dzięki podejściu nie mamy po tym żadnej awarii łącza komunikacyjnego. W rzeczywistości od pewnego czasu nie restartujemy serwera co 15 dni, ale nadal nie ma błędu (dotknij drewna). :) Jak na twój opis wydaje się, że ustawiłeś wait_timeout na 10 minut, więc domyślam się, że otrzymywałbyś błędy z różnicą czasu około 10 minut. Proszę zauważyć, że nie jest konieczne posiadanie tego błędu przy każdym resetowaniu połączenia MySQL po wait_timeout. Będzie tam tylko wtedy, gdy będziesz miał dostęp do bazy danych w tym czasie. :)

0

Myślę, że this post może pomóc. W takim przypadku zwiększenie wartości parametru wait_timeout powoduje jedynie odłożenie czasu przejścia, a nie rozwiązanie problemu.

Problem może być związany z tym:

  • otworzyć sesję hibernacji
  • zrobić kilka rzeczy, które zajmują więcej czasu niż wartość wait_timeout swojej bazie
  • spróbować użyć tego hibernacji sesja. Wiadomość, którą tu skomentujesz, pojawi się:

Udokumentowałem przypadek w here, jeśli jesteś zainteresowany.

Powiązane problemy