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.