Dobry den,

tohle je podle mne pekny, cisty kod. Jeste jsem si zvykl ty promenne con, st, rs delat final. Nechci prece zavirat jiny objekt (spojeni, prikaz, vysledek), nez s jakym se do kazdeho toho bloku try vstupovalo.

V tehle trojici Connection - Statement - ResultSet je z hlediska zivotniho cyklu ten Statement tim nejmene zajimavym clenem (pokud to nahodou neni opakovane volany PreparedStatement). Obcas povazujeme za uzitecne metody, ktery mezi svymi parametry dostavaji Connection, neco vyselekti a vrati ResultSet. Zodpovednosti klienta takoveto metody je zavrit ten ResultSet. Ten Statement, ze ktereho ten ResultSet vznika, tak trochu visi ve vzduchu. Neni dulezity, vyjma toho, ze je treba jej ve spravny okamzik zavrit. Ten okamzik nenastava uvnitr selektici metody, ale az pote, kdy je ResultSet zkonzumovana. Rozresili jsme to specialni tridou StatementClosingDelegatingResultSet (nazev rika vse a je priblizne stejne dlouhy jako implementace), ktera pri uzavirani ResultSetu uzavre i ten Statement. Timto zpusobem se nam dari clenit i pomerne rozsahlou databazovou praci do snesitelne dlouhych metod.

Honza Dvorak


Michal Palička napsal:

Dobry den,

ten ukazkovy kod vypada teda dost brutalne.

Mne se osvedcilo pouziti vnorenych try-finally bloku.
Myslim, ze je to prehlednejsi a elegantnejsi.

Priklad:

void myMethod() throws SQLexception {
   Connection con = ds.getConnection();
   try {
       Statement st = con.createStatement();
       try {
ResultSet rs = st.executeQuery(); try { ... // zpracovani dat z 'rs' } finally {
               rs.close();
           }
       } finally {
           st.close();
       }
   } finally {
       con.close();
   }
}

Vyse uvedeny kod predpoklada, ze objekt (con, st, rs) je bud vytvoren
uspesne anebo je vyhozena vyjimka (tj. nenastane situace, ze napr. metoda
ds.getConnection() sice skonci bez vyjimky, avsak vrati <null>).
To by u JDBC melo platit.

Osetreni vyhozene vyjimky (SQLException) muzete resit bud v metode volajici anebo cele telo metody myMethod obalit jeste jednim blokem (try-catch).

Pokud takovych metod budete mit vice, budou se v podstate lisit jenom kodem
v tom nejvnitrnejsim bloku. Opakujici se kod by se asi dal dale eliminovat.
("template method" pattern, "command" pattern).

mp.



Odpovedet emailem