úterý 16. ledna 2007

Jak si nenaběhnout s Hibernate

Hibernate je skvělý nástroj, ale přes veškerou abstrakci, DAO a podobné fičury, je potřeba nepřestat myslet. Já jsem si naběhl takto: zadání je metoda, přijímající seznam identifikátorů, která má vracet seznam řekněme produktů, které mají v databázi tyto identifikátory. Nic těžkého, že?
public Produkt[] getAll(Serializable id[]) {
List<Produkt> list = new ArrayList<Produkt>(id.length);
for (Serializable i: id) {
Produkt p = (Produkt)session.get(Produkt.class, i);
if (p != null)
list.add(p);
}
return list.toArray(new Produkt[]{});
}
Při zběžném otestování funguje báječně, nicméně v produkčním nasazení se objeví problém. Pokud je identifikátorů pár stovek, ne-li tisíc, provedení se může protáhnout na pár minut. Každé get() je totiž jeden SQL select...
Správné řešení obnáši použití Query:
public Produkt[] getAll(Serializable id[]) {
List<Produkt> list = session
.createQuery("from Produkt where id in (:id)")
.setParameterList("id", Arrays.asList(id)).list();
return list.toArray(new Produkt[]{});
}

Žádné komentáře:

Okomentovat