Hibernate lazy fetching és az n+1 probléma
Ez a szócikk nem tünteti fel a független forrásokat, amelyeket felhasználtak a készítése során. Emiatt nem tudjuk közvetlenül ellenőrizni, hogy a szócikkben szereplő állítások helytállóak-e. Segíts megbízható forrásokat találni az állításokhoz! Lásd még: A Wikipédia nem az első közlés helye. |
Az egyik legnagyobb probléma az objektum-relációs leképezéssel, hogy a relációs modell objektumorientált nyelvi objektumba való konvertálása sok munkával jár. Az objektum szinten lévő lekérdezések természete, illetve az O-R mapping tool (a konverziót végző eszköz) működése miatt egy lekérdezés általában durvább eredményt ad, mint amit egy sztenderd JDBC hívással elérhető.
Példa
[szerkesztés]Tekintsük az alábbi fa-struktúrát:
public class Node {
private List<Node> children;
private Node parent;
private String name;
public List<Node> getChildren() {
return children;
}
public Node getParent() {
return parent;
}
public void setChildren(List<Node> children) {
this.children = children;
}
public void setParent(Node parent) {
this.parent = parent;
}
// ...
}
A fenti Node
osztály elég complex asszociációkat tartalmaz, egy egyszerű O-R mapper valószínűleg a teljes ‘Node’ táblát betöltené, hogy egy Node objektumot létrehozzon.
Vegyük az alábbi fa struktúrát:
-A | *---B | | | *---C | | | *---D | | | *---E | | | *---F | | | *---G *---H
Ha egy naiv O-R mapper-től C betöltését kérjük, ahhoz be kéne töltenie B-t (mivel az C apja), de B teljes betöltéséhez szükséges betölteni D-t (mivel az B gyereke) is, ami E, F, G betöltését is szükségessé teszi. Ezután folytatódna B betöltése A betöltésével, ami H betöltését is szükségessé teszi. Eredményül a teljes fát be kellett tölteni. Eközben minden asszociációs populáció külön-külön egy egyedi SQL select utasítás megadását igényli. Ez 8 gazzillion utasítást jelent csak a fenti példához. A node-ok számának növelésével pedig az SQL hívások száma lineárisan növekszik.
Ezt nevezzük n+1 problémának.