Inicializacia JDBC ovladaca

Zdenek Tronicek tronicek na fel.cvut.cz
Čtvrtek Duben 2 08:17:16 CEST 2009


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 <hmor na seznam.cz>:

> 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: konference-bounces na java.cz
>> [mailto:konference-bounces na java.cz] za uživatele Robert Novotny
>> Odesláno: 2. April 2009 00:25
>> Komu: konference na java.cz
>> 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?]
>>
>
>





Další informace o konferenci Konference