Newsgroup: it.comp.java
Titolo: Statement e ResultSet

Ciao, ho due problemi col JDBC.
Il primo e' questo:
se scrivo
  Statement st = con.createStatement();
  ResultSet rs = st.executeQuery ("select * from tabella");
funziona perfettamente. Se invece scrivo
  Statement st = con.createStatement();
  st.executeQuery ("select * from tabella");
  ResultSet rs = st.getResultSet();
mi da una "state non defined exception". Qualcuno sa come mai ?
Il secondo problema e' quali siano le parti effettivamente da
sincronizzare per gestire un accesso multithread.
Per esempio se faccio
Statement st1 = con.createStatement();
Statement st2 = con.createStatement();
st1 e st2 puntano allo stesso oggetto oppure la connection ne
restituisce due diversi ?
In altre parole qual' e' l' insieme minimo di struzioni da sincronizzare
?
Grazie in anticipo
Ciao

?
Io di solito uso connessioni separate per thread diversi (le pesco da
un pool che mi precostituisco).
Ciao,
| --
| Bruno Bossola
| Groupware/Intranet B.U.           Phone:  +39-11-2252211
| ATOS SpA v.Vaninetti 27           Fax:    +39-11-2203182
| I-10148 Torino ITALY              Change NOSPAM in atos to email me!

 un pool che mi precostituisco).
Scusa, ma non capisco cosa intendi.
Nel senso che all' interno di ogni thread scrivi
Connection c = DriverManager.getConnection ("jdbc:odbc:tabella");  ?
Io credevo che aprire una connessione fosse una cosa particolarmente lunga e
che andasse fatta nella init del servlet.
Puoi darmi qualche indicazione in piu' ?
Grazie 1000
Ciao

Per l'appunto, per citarmi, "le pesco da un pool".
Ovvero in fase di inizializzazioni mi creo un pool di connessioni,
cioe' un certo numero di connessioni che richiedo al driver manager, e
quindi quando un oggetto ha bisogno di una connessione invece di
chiederla al drivermanager:
  Connection c = DriverManager.getConnection ("jdbc:odbc:tabella"); 
la chiede al pool:
  Connection c = Pool.getConnection ();  
ed invece di chiuderla dopo l'uso:
  c.close();
la rilascia al pool:
  Pool.releaseConnection(c);	
Il pool si occupa di gestire le problematiche di concorrenza / carico
/ ecc. legate all'accesso simultaneo di più oggetti al sistema. 
Ci sono comunque ormai dei pacchetti commerciali che si occupano di
gestire questo tipo di approccio (mi pare DbTools della RogueWave, ad
esempio)
Ciao,




 / ecc. legate all'accesso simultaneo di più oggetti al sistema.
Ok, immaginavo una cosa simile, ma il mio dubbio rimane.
Nella getConnection ci sara' scritto
return con;
Solo che in questo modo credo che mi venga restituita una reference sempre alla
stessa connection. In altre parole ho 100 thread che condividono un' unica
connection. E quando faro' un con.getStatement() credo mi verra', anche in questo
caso, restituita una reference sempre ad un unico oggetto Statement.
E quindi credo che qualcosa lo si dovra' sincronizzare.
Ho detto qualcosa di sbagliato ?
Grazie ancora
Ciao

connection. 
No. Come ti ho gia' detto, "in fase di inizializzazione mi creo un
pool di connessioni, cioe' un certo numero di connessioni che richiedo
al driver manager".
Per esempio, all'inizio mi creo un pool di 10 connessioni. Al primo
thread che fa una richiesta il pool assegna la connessione 0, al
secondo la connessione 1, al terzo la connessione 2, e cosi via.
I thread, avuta la connessione ad uso _esclusivo_ eseguono la/le loro
query e, terminato al lavoro, rilasciano la connessione al pool che
quindi e' in grado poi di riassegnarla ad un altro thread che ne
faccia richiesta. Se al momento della richiesta il pool non e' in
grado di fornire una connessione, perche' nel frattempo sono state
tutte assegnate, allora esso fermerà i thread che la richiedono su un
semaforo, attendendo che le connessioni gli vengano riconsegnate.
Capito ora?
