Newsgroup: it.comp.java
Titolo: Driver JDBC: che fine fa ??? :(

Ciao,
ho un servlet che al suo interno ha una classe che si occupa di gestire
le operazioni su database tramite jdbc:odbc sotto win nt con motore di
Access.
Il tutto funziona senza problemi se all' interno del servlet stesso
(nella init) scrivo
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
che gia' come cosa mi lascia molto perplesso perche' non capisco dove
vada a finire sto driver che non istanzio nel referenzio in nessun modo.
Il problema e' che se sposto, come mi sembra giusto, la riga che carica
il driver all' interno della classe che si occupa del database la cosa
non funza piu' :(
Se faccio un metodo di questo tipo all' interno della mia classe
DataBase
public Driver loadDriver() throws InstantiationException,
ClassNotFoundException, IllegalAccessException {
  return d =
(Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
}
e lo richiamo nel servlet semplicemente con
loadDriver();
tutto funziona.
Qualcuno puo' spiegarmi dove viene messo questo driver e come posso
caricarlo non nel servlet ?
In tutti gli esempi che ho visto viene sempre caricato nel servlet... :(
Ciao e grazie in anticipo

 [...]
Saluti, 
	Cris

 Be' dipende da dove lo metti. :)
Argh...mi viene il dubbio che sia allora un problema di scope (e di
briscole :) )
Mi viene il dubbio che il driver resti registrato solo per la durata del
metodo. In pratica viene creato un DriverManager, lo riempie e a fine
metodo lo butta.
C' ho azzeccato ? :)
Vado a provare dichiarando un DriverManager come variabile globale, ecc.
:)
Grazie 1000
Ciao

 :)
Uh? DriverManager in realta' e' una factory per le connessioni, e in effetti
tutti i suoi metodi sono statici! :)
Quello che avevo in mente (scusa, mi sono spiegato poco e male) e' se per caso
la tua Class.forName(<driver>) non venisse eseguita *dopo* la DriverManager.getConnection().. il che dipende appunto da dove la metti;
questo
e' il motivo per cui di solito si piazza nell'inizializzatore statico - che viene
eseguito al momento del "load" di una classe.
Saluti,
	Cris
-- 
Cristiano Sadun
Software Engineering & Consulting
email: crsadun#tin$it
(please substitute # by @ and $ by .)

 eseguito al momento del "load" di una classe.
Ehm...cosa intendi con inizializzatore statico ?
Se parli del main non posso farlo semplicemente perche' non c'e' (e' una
servlet).
Ho risolto cosi':
Dichiaro un driver manager come variabile globale della classe che
gestisce le interrogazioni
DriverManager man;
e poi ci registro i driver
man.registerDriver((Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance());
e cosi' sembra funzionare.
Ciao e grazie ancora

 servlet).
:) Ogni classe puo' avere una sezione "static" che viene eseguita al caricamento:
class Pippo {
 static {
   System.out.println("Buondi' sono Pippo");
 }
}
Saluti,
	Cris

riesci a riassumerlo in due righe ?
Factory vuol dire "fabbrica": un oggetto-factory, o un metodo-factory,
e` uno che ha come compito essenziale quello di costruire altri oggetti.
Visto che se posto solo due righe, con 6 citate, qualche server protesta,
evidenziamo uno dei principali vantaggi delle factory... si puo` evitare
di dipendere da specifiche classi usandone solo le interfacce, ma questo
non sarebbe possibile per generare nuovi oggetti, perche` la new vuole
il nome della specifica classe concreta da usare; spostando tutte le new
in questione entro una classe factory, allora solo quella factory dipende
dalla specifica classe concreta da usare, e tutto il resto del codice invece
dipende solo dalle interfacce (aspetto cruciale dello schema "inversione
delle dipendenze" di R. Martin).
Alex