Dobry den,

presne tak. Kdyz napisete do kodu new MyDriver();, tak svazete aplikaci s konkretnim driverem. Proto se ustalila konvence, ze driver ma staticky inicializator, ktery jej zaregistruje u DriverManager:

public class MyDriver implements Driver {

    static {
        DriverManager.registerDriver(new MyDriver());
    }
    ...
}

Pak staci natahnout tridu driveru do pameti. Bud pres Class.forName() nebo nastavenim property jdbc.drivers na prikazove radce.

Z.T.
--
Zdenek Tronicek
Department of Computer Science and Engineering
Prague                   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Quoting Jan Moravec <[email protected]>:

Odchytavani ClassNotFoundException neni az takova silenost. Co kdyz JDBC
driver neni distribuovan jako soucast Vasi aplikace a v runtimu se nenajde?
Asi nebudete chtit v aplikaci chytat NoClassDefFoundError...

To, ze driver neni distribuovan s aplikaci je celkem bezne u aplikaci
deployovanych do ruznych j2ee kontejneru, kde je driver casto dostupny pres
nejaky sdileny classloader. Nerikam, ze to tak musi byt vzdy, ale je to
celkem rozumny pattern. Pokud delate nejakou standalone aplikaci, pak je to
samozrejme trochu jina situace.

V kazdym pripade mi neprijde optimalni natvrdo linkovat aplikaci s
konkretnim driverem jak navrhujete (import + new ...mysql.Driver()). Co kdyz
budete chtit driver vymenit za jiny? Bez prekompilovani a redeploy aplikace
se to pak neobejde. Podobne je to i se zadratovanim jmena tridy primo do
kodu aplikace. Pouzivejte konfig soubory...

Pokud tedy JDBC spojeni vytvarite rucne bez podpory nejakeho kontejneru,
Class.forName bych urcite nezavrhoval :)

Honza

-----Původní zpráva-----
Od: [email protected]
[mailto:[email protected]] za uživatele Robert Novotny
Odesláno: 2. April 2009 00:25
Komu: [email protected]
Předmět: Inicializacia JDBC ovladaca


Dobry den,
zamyslel som sa nad ukazkovymi kodmi inicializacie JDBC
ovladaca a mam
mozno hlupu otazku.
Takmer kazda prirucka / tutorial tvrdi, ze JDBC ovladac sa
inicializuje
nasledovne:

   try {
     Class.forName("com.mysql.jdbc.Driver");
   } catch (ClassNotFoundException e) {
   e.printStackTrace();
   }

a pripojenie sa ziska cez Connection =
DriverManager.getConnection(...),
ale to nie je dolezite.

Nie je predsa lepsie rovno vytvorit instanciu ovladaca a vyhnut sa
odchytavaniu
nanajvys obskurnej ClassNotFoundException?

   import com.mysql.jdbc.Driver;

   Driver driver = new Driver();
   Connection = DriverManager.getConnection(...)

Pripadne nezvyklejsie:
   new Driver();
   Connection = DriverManager.getConnection(...)

Dokumentacia tvrdi, ze Class.forName inicializuje ovladac
a zaregistruje ho v DriverManageri (zvycajne v bloku statickej
inicializacie
v implementacii Drivera). Ale podla JLS sa toto iste musi
stat pred vytvorenim prvej instancie konkretneho Drivera.

Chapem nieco zle? Alebo vsetci opisuju z prazdroja, ktory
ustanovil, ze driver sa inicializuje cez Class.forName? Alebo
sa vsetci boja vytvorenia instancie, ktora sa nepouziva? [Ci
vytvorenia instancie, ktora sa nevlozi do premennej?]





Odpovedet emailem