ďťż
 
[DB2/Websphere]: JDBC - result set closed ďťż
 
[DB2/Websphere]: JDBC - result set closed
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lunadance.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com