2009-09-10 11 views
7

uzyskać następujące wyjątki w godzinach:Java JDBC Reply.fill()

com.ibm.db2.jcc.b.gm [JCC] [T4] [2030] [11211] [ 3.50.152] Wystąpił błąd komunikacji podczas operacji na podstawowym gnieździe połączenia, strumieniu wejściowym gniazda, lub wyjściowym strumieniu gniazda. Błąd lokalizacji: Reply.fill(). Wiadomość: reset połączenia. ERRORCODE = -4499, SQLSTATE = 08001

Problem polega na tym, że kod wykonuje się pomyślnie od dłuższego czasu, a następnie nagle otrzymuję ten wyjątek. Działa jednak perfekcyjnie, gdy ponownie uruchomię kod.

Czy ktoś może mi powiedzieć, co może być nie tak i podać mi kilka wskazówek, aby rozwiązać ten problem.

+0

Odsyłam ten link również http://www-01.ibm.com/support/docview.wss?uid=swg21962086 i http://www-01.ibm.com/support/docview.wss?uid = swg21600160 –

Odpowiedz

0

Wygląda na to, że połączenie jest limitowane. Naprawdę nie wiem, gdzie jest problem. Może to być połączenie z serwerem db. Przykro mi, że nie mogę ci więcej pomóc, ale mam nadzieję, że to pomoże.

3

Jest to znak nieprawidłowego zamykania/zwalniania zasobów JDBC. Musisz zdobyć i zamknąć wszystkie zasoby JDBC w możliwie najkrótszym zakresie, tj. Zamknąć je w odwrotnej kolejności w bloku finally bloku o tym samym bloku metod, jaki je zdobył. Na przykład.

Connection connection = null; 
Statement statement = null; 
ResultSet resultSet = null; 
try { 
    connection = database.getConnection(); 
    statement = connection.createStatement(); 
    resultSet = statement.executeQuery(SQL); 
    // ... 
} finally { 
    if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
    if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
} 

Jeśli nie zamknąć je właściwie tak szybko, jak to możliwe, DB weźmie go w swoje ręce prędzej czy później i aplikacja może się złamać, prędzej czy później, jak spotkaliśmy się.

Aby poprawić wydajność połączenia, skorzystaj z puli połączeń - nadal musisz je zdobyć i zamknąć w taki sam sposób, jak tutaj powyżej! Jest to teraz tylko implementacja puli połączeń, która pod maskami martwi się o w rzeczywistości zamykając połączenie lub nie.

+1

Mam nadzieję, że blok try-with-resources w Javie 7 pomoże złagodzić niektóre z nich w przyszłości. Chociaż jest część mnie, która zamyka się z przerażeniem, że pozwala deweloperom uciec, nie oczyszczając zasobów. Obawiam się, że może to prowadzić do zaniedbania rozwoju. A co się stanie, jeśli programiści będą musieli pracować nad kodem pre-JRE 7? Po prostu głośno myślę w odpowiedzi na twoją odpowiedź. Ale zdecydowanie ++ w odpowiedzi. –

+1

@Chris: zdecydowanie ARM pomoże bardzo w zredukowaniu elementu 'close()' -in -'''''''''''''. Możesz jednak wybrać JPA, co z kolei zmniejszy cały zestaw instrukcji JDBC do onelinera. – BalusC

+1

Interesujące. Czy znasz jakieś artykuły na temat JPA w porównaniu z czystym JDBC.Sądzę, że pochodzę z doświadczenia, gdzie warstwy abstrakcji sprawiały, że nasza aplikacja była coraz gorsza i trudniejsza do debugowania. Zauważyłem, że czysty JDBC jest całkiem prosty (przynajmniej podczas pracy z czystymi łańcuchami SQL). Widzę, gdzie lepiej by działało z obiektami. I obsługuje zasób zamykający dla ciebie? –

0

I wydaje może to być spowodowane przez https://www-304.ibm.com/support/docview.wss?uid=swg1IC63952

Przynajmniej dla nas jest.

Sprawdź swoje komunikaty o błędach db2diag.log dla ZRC=0x8005006D=-2147155859=SQLE_CA_BUILT "SQLCA has been built and saved in component specific control block.", gdy otrzymasz takie rozłączenia.

Później w tym tygodniu planujemy aktualizację do DB2 9.7 FixPack 3a - odpisze, jeśli to pomogło.

1

Niedawno stanęliśmy twarzą w twarz z tym problemem, a było to spowodowane mylącymi klauzulami AND oraz klauzulami rownum i <. Ułożenie aparatów ortodontycznych w odpowiednich miejscach rozwiązało problem.

+1

ten post musi być komentarzem, a nie odpowiedzią – Chani