{"id":138,"date":"2016-07-20T12:23:54","date_gmt":"2016-07-20T10:23:54","guid":{"rendered":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=138"},"modified":"2022-12-04T12:24:16","modified_gmt":"2022-12-04T11:24:16","slug":"performance-bei-jpa-abfragen","status":"publish","type":"post","link":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=138","title":{"rendered":"Performance bei JPA Abfragen"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Umgebung<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wildfly 10<\/li>\n\n\n\n<li>Eclipselink<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn keine providerspezifischen Hilfskonstrukte verwendet werden, werden alle JPA-Abfragen in eine SQL-Anweisung \u00fcberf\u00fchrt und an die Datenbank gesendet. Ausnahmen sind lediglich die Abfragen direkt \u00fcber find(id) und interne Abh\u00e4ngigkeiten in den Objekten, die auf den Second-Level-Cache zugreifen. Somit wird der Cache in weiten Teilen nicht genutzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies hat zur Folge, dass bei Abfragen, die nicht \u00fcber die find() Methode laufen, teure Datenbank Operationen ausgef\u00fchrt werden m\u00fcssen. Insbesondere bei gro\u00dfen Objekten mit vielen Unterobjekten, kann dies zu sp\u00fcrbaren Verz\u00f6gerungen f\u00fchren, da ggf. sehr viele Datenbank-Abfragen abgesetzt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachvollzogen werden kann dies am besten, wenn SQL Logging eingeschaltet und eine Abfrage mit eine where-Bedingung mehrfach gestartet wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine M\u00f6glichkeit die Nutzung des Caches zu verbessern ist es, in den JPA-Abfragen lediglich die Id der gesuchten Objekte \/ des gesuchten Objektes abzufragen. Als Ergebnis erh\u00e4lt man z.B. eine Menge von Long-Werten (wenn das Objekt eine entsprechende Id hat). Die Objekte werden in einem zweiten Schritt \u00fcber find() abgerufen und in das Ergebnis gehangen. Dies macht die Methoden f\u00fcr die Suche etwas l\u00e4nger, kann aber erhebliche Performance-Unterschiede bewirken, da nur noch eine sehr einfach SQL Abfrage statt vieler komplexer gesendet wird, wenn das Objekt im Cache ist. Dieses Vorgehen eignet sich f\u00fcr Objekte, die nicht nur einmal abgefragt werden (was wohl die meisten sind).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie immer ist dies nicht die L\u00f6sung aller Probleme. Der vorgestellte Weg kann aber einiges bewirken, ohne Features zu nutzen, die nicht von allen JPA-Providern unterst\u00fctzt werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Umgebung Wenn keine providerspezifischen Hilfskonstrukte verwendet werden, werden alle JPA-Abfragen in eine SQL-Anweisung \u00fcberf\u00fchrt und an die Datenbank gesendet. Ausnahmen sind lediglich die Abfragen direkt \u00fcber find(id) und interne Abh\u00e4ngigkeiten in den Objekten, die auf den Second-Level-Cache zugreifen. Somit wird der Cache in weiten Teilen nicht genutzt. Dies hat zur Folge, dass bei Abfragen, die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7],"tags":[],"class_list":["post-138","post","type-post","status-publish","format-standard","hentry","category-jee","category-wildfly"],"_links":{"self":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=138"}],"version-history":[{"count":1,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/138\/revisions"}],"predecessor-version":[{"id":139,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/138\/revisions\/139"}],"wp:attachment":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}