[DB2/Websphere]: JDBC - result set closed
AXJ - 16-02-2007 00:01
[DB2/Websphere]: JDBC - result set closed
Przenoszac aplikacje z Tomcata na WebSphera napotkalem na problem z JDBC, ktory na Tomcatcie sie nie pojawial w przypadku takich baz jak Oracle, Informix, DB2, MSSQL.
W konfiguracji zrodla danych w Websphere korzystam z zrodla danych typu XA i definiuje 'Źródło danych' - nie używam 'Źródła danych (WebSphere Application Server 4)'.
Wyglada na to, ze jak mam zagniezdzonego ResultSeta "rs2" to gdy jest on zamykany to rowniez zamyka ResultSeta zewnetrzengo "rs1". Wyglada to na jakis blad w sterowniku JDBC.
Kod zrodlowy w ktorym wystepuje ten problem: -------------------------------------------- ResultSet rs1 = null; PreparedStatement pstm1 = null; ResultSet rs2 = null; PreparedStatement pstm2 = null; try { pstm1 = con.prepareStatement( "SELECT * FROM teczka"); rs1 = pstm1.executeQuery(); while (rs1.next()) { // TUTAJ POJAWIA SIE BLAD int idTeczki = rs1.getInt(1); System.out.println("Id teczki: " + idTeczki); pstm2 = con.prepareStatement( "SELECT * FROM dokument WHERE id_teczka = ?"); pstm2.setInt(1, idTeczki); rs2 = pstm2.executeQuery(); while (rs2.next()) { System.out.println("Id dokumentu: " + rs2.getInt(2)); } rs2.close(); pstm2.close(); } rs1.close(); pstm1.close(); } catch (SQLException ex) { ex.printStackTrace(); } --------------------------------------------
Przesylam fragment stosu bledu: -------------------------------------------- com.ibm.db2.jcc.b.SqlException: Invalid operation: result set closed at java.lang.Throwable.<init>(Throwable.java:57) at java.lang.Throwable.<init>(Throwable.java:68) at java.sql.SQLException.<init>(SQLException.java:55) at com.ibm.db2.jcc.b.SqlException.<init>(SqlException .java:96) at com.ibm.db2.jcc.b.rc.mb(rc.java:3413) at com.ibm.db2.jcc.b.rc.c(rc.java:290) at com.ibm.db2.jcc.b.rc.next(rc.java:277) --------------------------------------------
Jezeli ktos napotkal na podobny problem bardzo prosze o pomoc? Inne sugestie tez mile widziane.
Pozdrawiam, AXJ
-- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Krzysztof Paz - 18-02-2007 00:04
....to niekoniecznie musi być błąd sterownika JDBC.
Wydaje mi się, że doprecyzowania mogłoby wymagać stwierdzenie, że w środowisku Tomcata tego problemu nie było a na WASie jest - jakie mamy wersje tych wszystkich klocków, co się dokładnie zmieniło i jak to rzeczywiście wyglądało pierwotnie, gdy działało...
.... a napisałem to w kontekście podejrzenia, iż na bez względu na to gdzie użyjemy tego połączenia JDBC, to może zdażyć się "by-design" (wskutek ograniczeń JDBC 2.0 i różnić implementacji), że gdy rs2 zostanie zamknięty to zamknięty będzie domyślnie również rs1 ustanowiony w tej samej instancji klasy na tych samych obiektach/kontekście... - zdaża się bowiem, że to zależy od wersji JDBC (2/3/4), konkretnej implementacji danego vendora (MySQL/Postgres/DB2/Oracle/Informix/MsSQL/etc.) drivera JDBC i zadanych parametrów.
Myślę, że w przypadku DB2, warto zerknąć na opisy: -v8 1. http://publib.boulder.ibm.com/infoce...d/tjvjdmlt.htm 2. http://publib.boulder.ibm.com/infoce...d/tjvrsush.htm -v9 1. http://publib.boulder.ibm.com/infoce...c/tjvrsush.htm 2. http://publib.boulder.ibm.com/infoce...c/tjvjdmlt.htm
i rozważyć przydatność zastosowania drivera zblizonego przynajmniej do JDBC 3.0 z wywołaniem stmt.getMoreResults(); i następującym kontekstem - jak w dokumentacji:
CallableStatement cstmt; ResultSet rs; ....
allableStatement cstmt; .... boolean resultsAvailable = cstmt.execute(); // Call the stored procedure if (resultsAvailable==true) { // Test for result set ResultSet rs1 = cstmt.getResultSet(); // Get a result set ... // Process ResultSet resultsAvailable = cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT ); // Check for next result set // but do not close // previous result set if (resultsAvailable==true) { // Test for another result set ResultSet rs2 = cstmt.getResultSet(); // Get next result set ... // Process either ResultSet } } resultsAvailable = cstmt.getMoreResults(Statement.CLOSE_ALL_RESULTS); // Close the result sets Inne przykłady różnić między JDBC 2 a 3 można na szybko prześledzić tutaj: http://www-128.ibm.com/developerwork...ary/j-jdbcnew/ - mamy tam też fragment opisujący owo zagadnienie - Returning multiple results A limitation of the JDBC 2 specification is that statements that return multiple results must have only one ResultSet open at any given time. As a part of the changes in JDBC 3.0, the specification allows the Statement interface to support multiple open ResultSets. It is important to note, however, that the execute() method still closes any ResultSets that were opened from a previous call to execute(). So, to support multiple open results, the Statement interface adds an overloaded version of the method getMoreResults(). The new form of the method takes an integer flag that specifies the behavior of previously opened ResultSets when the getResultSet() method is called. The interface defines the flags as follows:
CLOSE_ALL_RESULTS All previously opened ResultSet objects should be closed when calling getMoreResults(). CLOSE_CURRENT_RESULT The current ResultSet object should be closed when calling getMoreResults(). KEEP_CURRENT_RESULT The current ResultSet object should not be closed when calling getMoreResults().
Listing 2 shows an example of handling multiple open results.
String procCall = ""; // Set the value of procCall to call a stored procedure. // ...
CallableStatement cstmt = connection.prepareCall(procCall); boolean retval = cstmt.execute(); if (retval == false) { // The statement returned an update count, so handle it. // ... } else { // ResultSet ResultSet rs1 = cstmt.getResultSet(); // ...
retval = cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT ); if (retval == true) { ResultSet rs2 = cstmt.getResultSet();
// Both ResultSets are open and ready for use. rs2.next(); rs1.next(); // ... } }
Pozdrawiam, Kris
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MS SQL] "set names" (mySQL) w MS SQL
=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=
Oracle XE lub DB2 Express-C i wspolpraca z Visual C# 2005 Expess Edition
IBM DB2 Express - czy podobnie jak Oracle Expreess ma wycieta Javew procedurach?
Re: DB2 za darmo - =?ISO-8859-2?Q?troch=EA_wi=EAcej?=
=?ISO-8859-2?Q?db2_obj=EAto=B6=E6_bazy?=
[db2] Update sql posiłkowany danymi z innej tabeli
=?iso-8859-2?q?Konfiguracja_domy=B6lna_DB2_Express-C?=
=?iso-8859-2?q?problem_z_JDBC_(za_du=BFo_rekord=F3w=3F=3F)?=
db2 -klucze obce optymalizacja zapytan i inne
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|