2010-01-16 9 views
39

czytam tę radę z komunikatem o błędzie:Połączenie z MySql jest przerywane automatycznie. Jak poprawnie skonfigurować Connector/J?

Należy rozważyć albo upływającym i/lub połączenia testowania ważności przed użyciem w aplikacji, zwiększenie serwer skonfigurowany wartości limitu czasu klienta lub przy użyciu się Właściwość połączenia złącza/J 'autoReconnect = true' w celu uniknięcia tego problemu z .

Używam Spring i JPA. Gdzie powinienem skonfigurować Connector/J? (? W persistence.xml lub w konfiguracji sprężyny entityManagerFactory lub w dateSource konfiguracji sprężyny, lub gdzieś indziej)

+0

Proszę o pomoc https://stackoverflow.com/questions/47011116/the-last-packet-sent- pomyślnie-do-serwera-był-70-400-003-milliseconds-ag – Tony

Odpowiedz

54

Tekst opisuje trzy rozwiązania zapobiegające połączenia przerywa:

  1. skonfigurować ciąg połączenia z autoReconnect=true. Jest to właściwość ciągu połączenia adresu URL, który działa na poziomie sterownika. Musisz zmienić ciąg połączenia w konfiguracji źródła danych.

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true" 
    
  2. Zwiększ limit czasu. Zwykle jest to właściwość bazy danych. Możesz zwiększyć tę wartość, aby sprawdzić, czy przerwiesz połączenie.

  3. Skonfiguruj pulę połączeń, aby przetestować poprawność połączenia. Odbywa się to w puli, a nie na poziomie kierowcy. Będzie to zależeć od implementacji źródła danych, z którego korzystasz. Powinna jednak być konfigurowalna we właściwości źródła danych, jeśli korzystasz z puli połączonej, np. c3p0.

źródło dodatkowego komentarze:

  • DataSource/basen może mieć limit czasu, który odpowiada czasowi bezczynne połączenie remai ns w basenie. Nie mylić z czasem oczekiwania na db.
  • Istnieje kilka sposobów sprawdzenia poprawności połączenia. Jednym z typowych sposobów jest posiadanie tabeli testowej. Pula wyda polecenie wyboru w próbnej tabeli testowej, aby sprawdzić, czy połączenie jest nadal w porządku.
+6

Sterownik MySQL nie prawidłowo zaimplementował opcję autoReconnect. Pierwsze żądanie zakończy się niepowodzeniem, a sterownik podejmie próbę ponownego nawiązania połączenia AFTERWARDS. – Riking

+1

Ponieważ ta odpowiedź wydaje się być preferowana przez wyszukiwarkę, byłoby miło, gdyby przyszedł z dodatkowym wyjaśnieniem, na temat znaczenia wait_timeout dla MySQL i jak powinien grać z konfiguracją c3p0. W obliczu tego problemu widzę, że czas oczekiwania MySQL to 28800. Jeśli to 8h, to nie mam ochoty ustawiać go na 72h. Nie rozumiem nawet, jak można zaakceptować, że połączenie będzie zawieszone tak długo, jak 8 godzin. – Stephane

+5

@StephaneEybert Znalazłem naprawdę ładne wyjaśnienie tego problemu tutaj: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html. Może to pomóc komuś w przyszłości – sunil

14

AutoReconnect nie jest zalecany. Od MySQL here

Czy kierowca powinien próbować przywrócić nieaktualne i/lub martwe połączenia? Po włączeniu sterownik wygeneruje wyjątek dla zapytań wysłanych na nieaktualne lub martwe połączenie, które należy do bieżącej transakcji, , ale spróbuje ponownie nawiązać połączenie przed następnym zapytaniem wydanym na połączenie w nowej transakcji.Korzystanie z tej funkcji nie jest zalecane, ponieważ ma skutki uboczne związane ze stanem sesji i zgodnością danych , gdy aplikacje nie obsługują poprawnie interfejsu SQLExceptions i jest przeznaczone tylko do użycia, gdy nie można skonfigurować aplikacji do obsłużyć SQLExceptions wynikające z martwych i nieaktualnych połączeń poprawnie. Alternatywnie, w ostatniej opcji, zbadaj ustawienie zmiennej serwerowej MySQL "wait_timeout" na wysoką wartość zamiast domyślnej na 8 godzin.

+4

Więc co jest zalecane zamiast tego? – jackthehipster

+0

użyj c3po z opcją testConnectionOnCheckout = true –

+0

@AndersB Używam c3po, ale błąd nadal występuje https://stackoverflow.com/questions/47011116/the-last-packet-sent-successfully-to-the-server-was-70 -400-003-milliseconds-ag – Tony

-8

To jest dla ludzi takich jak ja, którzy znajdują ten stary post przez wyszukiwarki.

Inne odpowiedzi są lepsze długoterminowe rozwiązania. Ale jeśli potrzebujesz tylko połączenia mysql działającego od razu, możesz shutdown następnie restarttomcat i wszystko będzie działało dobrze przez pewien czas. Pozwala to na uniknięcie przestojów systemu podczas opracowywania długoterminowego rozwiązania.

Przejdź do $CATALINA_HOME w terminal, następnie wpisz shutdown.sh, następnie wpisz startup.sh. Zaczekaj chwilę, aż sekwencja uruchamiania się zakończy, a następnie Twoje aplikacje będą działać przez jakiś czas.

+0

Pytanie nie wspomniało nic o korzystaniu z Tomcat. – thechrisproject

+0

@thechrisproject Pytanie dotyczy wiosny. Tomcat to podstawowy kontener służący do przechowywania aplikacji wiosennych. A metoda opisana w tej odpowiedzi rozwiązuje problem OP. – CodeMed

+0

Dlaczego szukamy rozwiązania, które nie działa przez dłuższy czas? Wszystkie serwery i połączenia DB muszą być zaprojektowane z myślą o perspektywie długoterminowej. – sunil

0

Przeszedłem przez wiele rozwiązań i mój problem został rozwiązany, ale po pewnym czasie połączenie zostało przerwane lub rozłączone. Po 2 3 dniach otrzymałem rozwiązanie, które rozwiązuje mój problem.

wiele rozwiązań sugeruje użycie autoReconnect = true, ale kiedy przejrzałem dokumentację. Widziałem następujący tekst źródła opisujące parametr autoReconnect:

Korzystanie z tej funkcji nie jest zalecane, ponieważ ma skutków ubocznych związanych z stanu sesji i spójności danych

Kiedy spojrzałem w kodzie hibernacji. Podstawowy mechanizm połączenia Hibernate nie obsługuje ponownego łączenia, należy użyć puli połączeń H3C0 (która sama nie zawsze obsługuje ponowne łączenie).

Jednak raz używane H3C0, domyślnym zachowaniem wydaje się być przetwarzanie żądania, jeśli połączenie jest martwe, to użytkownik widzi i błąd - ale przynajmniej ponownie łączy się dla następnego żądania. Przypuszczam, że jeden błąd jest lepszy niż nieskończone błędy, ale nadal nie jest tak dobry, jak błędy zerowe. Okazuje się, że potrzebna jest opcjatestConnectionOnCheckout - której dokumentacja nie zaleca, ponieważ przetestowanie połączenia przed żądaniem może doprowadzić do obniżenia wydajności. Z pewnością oprogramowanie musi najpierw działać, a po drugie musi działać szybko.

Tak więc, aby podsumować, aby uzyskać połączenie z „praca” (które określają, jak w tym obsługa połączeń spadły o ponownym bez błędu): W „hibernate.cfg.xml”:

<!-- hibernate.cfg.xml --> 
    <property name="c3p0.min_size">5</property> 
    <property name="c3p0.max_size">20</property> 
    <property name="c3p0.timeout">1800</property> 
    <property name="c3p0.max_statements">50</property> 
    <!-- no "connection.pool_size" entry! --> 

Następnie należy utworzyć plik „c3p0.properties”, który musi znajdować się w katalogu głównym na ścieżce klasy (czyli w żaden sposób zastąpić go na poszczególne części wniosku):

c3p0.properties

C3P0.testConnectionOnCheckout = true

Jeśli to rozwiązanie nie działa, niż istnieje więcej możliwych rozwiązań: -

1. Add 

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml: 

<property name="hibernate.c3p0.validate">true</property> 

    Also checkout the last post on this page: 

    https://forum.hibernate.org/viewtopic.php?p=2399313 

    If all these not work than go [more][1] and read in detail 


    [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html 
Powiązane problemy