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