2011-02-09 10 views
9

Otrzymujemy CommunicationsException (od DBCP) po identyfikacji przez pewien czas (kilka godzin). Komunikat o błędzie (w Exception) znajduje się na końcu tego pytania - ale nie widzę wait_timeout zdefiniowanego w żadnym z plików konfiguracyjnych. (Gdzie powinniśmy szukać? Gdzieś z katalogu tomcat/conf?).Konfiguracja Tomcat za pomocą DBCP

Po drugie, zgodnie z sugestią Wyjątku, gdzie można umieścić właściwość połączenia Connector/J autoReconnect = true ""? Oto definicja zasobu w pliku conf/context.xml w Tomcat skonfigurować:

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 
      username="xxxx" password="yyyy" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/> 

Po trzecie, dlaczego czekać JVM do wywołaniu executeQuery(), aby rzucić wyjątek? Jeśli połączenie przekroczyło limit czasu, metoda getConnection powinna wygenerować wyjątek, czyż nie? Jest to część kodu źródłowego mówię:

 try { 
       conn = getConnection (true); 
       stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, 
               ResultSet.CONCUR_READ_ONLY); 
       rset = stmt.executeQuery (bQuery); 
       while (rset.next()) { 
        .... 

Wreszcie, oto 1st kilka linii ślad stosu ...

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago. The last packet sent successfully to the server was 84,160,848 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:532) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1938) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2571) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1451) 
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208) 

Są to powody, niektórzy z nas myślenie "zapomnij o dbcp, może być tak zależne od konfiguracji IDE i magii pod maską, że DriverManager.getConnection (...) może być bardziej niezawodny". Jakieś komentarze na ten temat? Dziękuję za twoje spostrzeżenia, - MS

Odpowiedz

14

Od DBCP wciąż zwrócony połączenia mysql otwarte dla nadchodzących żądań połączeń, oni padają ofiarami do MySQL Server timeout.

DBCP ma wiele funkcji, które mogą pomóc (można z nich korzystać począwszy od wersji Tomcat 5.5 IIRC).

validationQuery="SELECT 1" 
testOnBorrow="true" 

Walidacja zapewnia, że ​​połączenie jest ważne przed zwróceniem go do aplikacji webapp wykonującej metodę "wypożycz". Flaga oczywiście umożliwia tę funkcję.

Jeśli upłynął limit czasu (8 godzin), a połączenie jest martwe, testowane jest nowe połączenie (jeśli już go nie ma, jest ono tworzone) i dostarczane do aplikacji internetowej.

Inne możliwe podejścia:

  1. Użyj testWhileIdle="true" DBCP w ustawieniach zasobów, by sprawdzić również połączenia bezczynne, zanim zostanie wykryty skuteczny wniosek.

  2. użyć 'connectionProperties' do utwardzenia połączenia MySQL (np autoReconnect/autoReconnectForPools=true)

+1

Jeśli dobrze cię rozumiem, DBCP utrzymuje połączenie w swojej puli, ale serwer mySql je pomija, więc gdy to połączenie jest wysyłany do aplikacji, jest to zamknięte połączenie. Ma sens, ale czy to moje prawidłowe zrozumienie? Kolejny q: Czy jest jakiś sens używania sprawdzania poprawności/testOnBorrow, o którym wspomniałeś, a także testWhileIdle i autoRecon ... w pliku context.xml? Wchodzą do tego pliku, prawda? –

+0

1. Twoje zrozumienie jest prawidłowe. Wszystkie wskazane przeze mnie rozwiązania są komplementarne. Ustawienie jednej, nie przeszkadza w ustawianiu innych. Pas i szelki są lepsze ;-) Wprowadziłbym wszystkie 3 rozwiązania. testowanie podczas bezczynności oznacza krótszy czas oczekiwania w czasie "wypożyczenia". Ustawienia właściwości zmniejszą nieporównywalnie rozłączenia. Tak, wszystkie wchodzą do części Resource pliku context.xml twojej strony internetowej (później wdrożone przez tomcat w $ CATALINA_HOME/conf/Catalina/localhost/yourwebapp.xml). –

+1

AutoReconnect nie jest zalecane - http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html – OrangeDog

0

DBCP nie jest przeznaczone do użycia w produkcji, nawet autorzy tak twierdzą (zobacz tę prezentację: http://www.infoq.com/presentations/Tuning-Tomcat-Mark-Thomas).

Proponuję przyjrzeniu C3P0: http://www.mchange.com/projects/c3p0/index.html

+1

To nie jest prawdą, że * *. W twoim porównaniu są wątki, a różnica nie jest oczywista ani jasna. http://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs-c3p0 i http://stackoverflow.com/questions/490288/is-dbcp-apache-commons-database- connection-pooling-still-relevant – Alfabravo

+0

Ta prezentacja mówi o tym, kiedy należy korzystać z BIO i NIO, w zależności od długości sesji i wymagań współbieżności (jesteśmy niscy w obu kwestiach). Jakikolwiek wskaźnik, dlaczego nie powinien być stosowany w produkcji?Tylko wysoka częstotliwość rozważań dotyczących połączenia? Btw, spojrzałam na C3P0, wygląda na bardzo interesującą, możemy wypróbować, jeśli DBCP ciągle daje nam problemy. Dziękuję za informację, - MS. –

+0

Jeśli dobrze pamiętam, w tej prezentacji jest punkt, gdy facet mówi "DBCP nigdy nie był przeznaczony do użycia w produkcji" lub coś w tym stylu. Tak, to igła w stogu siana, ale nie mogłem o tym zapomnieć po tym, jak ją usłyszałem. – Spajus

Powiązane problemy