To class.forName zpusobi ze se driver zaregistruje do drivermanageru a ten pak 
vi jak ma zpracovavat jdbc url. V Oracle driveru je neco jako

static
  {
    ....
      if (defaultDriver == null)
      {
        defaultDriver = new OracleDriver();

        DriverManager.registerDriver(defaultDriver);
      }
    ....
  }

a staticka inicializace tridy se provadi prave v okamziku, kdy classloader 
nacte tridu a to je napr. kdyz se provede Class.forName.

Tom

-----Original Message-----
From: [email protected] on behalf of Jan Moravec
Sent: Thu 4/2/2009 1:39
To: 'Java'
Subject: RE: Inicializacia JDBC ovladaca
 
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

> -----Puvodní zpráva-----
> Od: [email protected] 
> [mailto:[email protected]] za uzivatele Robert Novotny
> Odesláno: 2. April 2009 00:25
> Komu: [email protected]
> Predmet: 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