Newsgroup: it.comp.java
Titolo: java.sql.SQLException: Operation not allowed after ResultSet closed

Non capisco perchè (apparentemente solo in Windows, ma devo fare qualche
altro test con Linux), mi appare l'errore in oggetto (Operation not allowed
after ResultSet closed, o, altre volte, java.lang.NullPointerException)
quando apro molti thread in contemporanea (una connessione per volta non ho
mai problemi).
Un po' di codice (class thread implements Runnable):
1) static Connection con e static Statement stmt definiti in un blocco
static {/*...*/}, eseguito quindi solo la prima volta, in cui si stabilisce
la connessione con un database A;
2) Connection con2 e Statement stmt2 definiti nel costruttore, eseguiti
quindi per ogni istanza della classe, in cui si stabilisce la connessione
con un database B;
3) public void run() contiene il segente codice:
     while (database.connesso)
      {
//se un'analogo ciclo ResultSet è già in esecuzione da un'altro thread, si 
aspetta il suo termine
       try
        {Thread.sleep(50);}
       catch (InterruptedException e) {}
      }
     database.connesso=true;
//database è una classe (vedi punto 5) di cui viene creata un'unica
istanza, passata al costruttore tutte le volte.
//penso, quindi, che sia condivisa da tutte le istanze di thread.
//Ho anche provato a trasferire le righe successive, fino a rs.close()
compreso, in un metodo synchronized, ma il risultato non cambia
     ResultSet rs=stmt.executeQuery("SELECT * FROM utenti WHERE
nome_utente='"+nome_utente+"';");
     while (rs.next())
      {
//... L'ERRORE VIENE GENERATO SEMPRE ALL'INTERNO DI QUESTO BLOCCO,
// O DELL'ANALOGO DI CUI AL PUNTO 4)
      }
     rs.close();
     database.connesso=true;
4) Blocco analogo per stmt2.
5) database è la seguente classe, di cui viene creata un'unica istanza,
passata al costruttore tutte le volte:
public class connessione
 {
  public boolean connesso;
  public connessione()
   {connesso=false;}
 }

 4) Blocco analogo per stmt2.
Scusate, ovviamente è database.connesso=false; 

Prova a mettere il blocco del while dentro try catch.
il metodo next() se non erro lancia una SQLException.
Poi scusa per il ciclo while (database.connesso)  non e' meglio(visto
che deve attendere la fine di un altro) che al posto di far dormire il
thread lo metti in wait() e poi il thread in esecuzione alla fine
risveglia con notifyAll() i thread in wait()?
bye zinco

 ha scritto nel messaggio
news:4447b1f9$0$29103$5fc...@news.tiscali.it...


 prova a non utilizzare sempre lo stesso Statement.
Esattamente questo č il problema: lo stesso Statement, o meglio due diverse 
istanze dello stesso Statement eseguite da due thread distinti (come 
potrebbero essere diversi, se sono istanze della stessa classe?). Č evidente 
dal debug che ho fatto che un thread inizia il ciclo relativo a ResultSet 
prima che l'altro thread l'abbia terminato. Questo č quello che devo 
evitare. E avrei detto (senza aver mai usato prima synchronized), che avrei 
risolto tutto trasformando il ciclo suddetto in un metodo synchronized... e 
invece no! E questo non capisco: perchč il codice seguente viene interrotto 
dall'esecuzione dello stesso metodo da parte di un altro thread??? Ma 
allora, che vuol dire synchronized???
private synchronized void risultato(String nome_utente)
 {
 ResultSet rs=stmt.executeQuery("SELECT * FROM utenti WHERE
nome_utente='"+nome_utente+"';");
     while (rs.next())
      {
//...
      }
     rs.close();
}

 diverse istanze dello stesso Statement eseguite da due thread distinti
Fermi tutti: ho sbagliato!
static Statement stmt era definito in un blocco static {/*...*/}, quindi
niente istanze! Era sempre la stessa! Sembra che, inserendo (senza static) 
la
creazione della variabile stmt nel costruttore sia tutto a posto!