{"id":86,"date":"2007-07-19T11:08:00","date_gmt":"2007-07-19T11:08:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=86"},"modified":"2007-07-19T11:08:00","modified_gmt":"2007-07-19T11:08:00","slug":"unterschiedlicher-persistence-context-und-speicherprobleme","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2007\/07\/unterschiedlicher-persistence-context-und-speicherprobleme\/","title":{"rendered":"Unterschiedlicher Persistence Context und Speicherprobleme"},"content":{"rendered":"<p>Ein Persistence Context verwaltet Entities und kontrolliert ihren Lebenszyklus.<\/p>\n<p>Man unterscheidet zwei Arten von Persistence Context:  <\/p>\n<p>\u2013<b>Transaction-scoped Persistence Context <\/b> <\/p>\n<p>\u2013<b>Extended Persistence Context <\/b> <\/p>\n<p>\u2022Mit EntityManagerFactory.createEntityManager() bekommt man den <b>Extended Persistence Context<\/b>.  <\/p>\n<p>\u2013createEntityManager() liefert den <b>Application-Managed <\/b><b>Entity Manager<\/b>.  <\/p>\n<p>\u2022Der Persistence Context beginnt, wenn der Application-Managed Entity Manager erzeugt wird und endet erst dann, wenn der Entity-Manager geschlossen wird.  <\/p>\n<p>\u2022Werden Entities geladen, so bleiben sie so lange im Extended Persistence Context, bis der der Kontext geschlossen oder alle Entities ausdr\u00fccklich gel\u00f6scht werden.  <\/p>\n<p>\u2013Entities bleiben also sehr lange \u201emanged\u201c und nur dann \u201edetached\u201c, wenn der Entity-Manager geschlossen wird.  <\/p>\n<p>&nbsp;  <\/p>\n<p>\u2022Der <b>Transaction Persistence Context <\/b>ist der \u00fcbliche Persistence Context eines \u201eContainer-Managed Entity Managers\u201c, der also \u00fcber den Container injiziert wird.  <\/p>\n<p>@PersistenceContext EntityManager em;  <\/p>\n<p>\u2022Der EntityManager erzeugt pro Transaktionen einen neuen Persistence Context.  <\/p>\n<p>\u2013Der Persistence Context endet bei einem Commit oder Rollback der Transaktion.  <\/p>\n<p>\u2022Innerhalb der Transaktion werden die zum Beispiel \u00fcber find() oder Query geladenen Entites zu managed Entities.  <\/p>\n<p>\u2022Da nach der Transaktion der Persistence Context endet, werden die dort verwalteten Entities detached.  <\/p>\n<p>&nbsp;  <\/p>\n<p>\u2022Da der Transaction Persistence Context pro Transaktion aufgebaut wird, ist die Anzahl der verwalteten Objekte relativ klein.  <\/p>\n<p>\u2022Der Extended Persistence Context ist oft deutlich l\u00e4nger und kann nach einer Zeit sehr viele Objekte aufnehmen.  <\/p>\n<p>\u2013Damit kann das zu einem Speicherproblem werden.  <\/p>\n<p>&nbsp;  <\/p>\n<p>\u2022Um beim Extended Persistence Context kein Speicherproblem zu bekommen gibt es unterschiedliche Strategien:  <\/p>\n<p>\u2013Von Zeit zu Zeit clear() vom EntityManager aufrufen. Das detached Objetkte.  <\/p>\n<p>\u2013Auf das passende Lazy-Load achten.  <\/p>\n<p>\u2013Weniger Objekte laden: Bei unachtsamem Design werden oft viel zu viele Objekte geladen.  <\/p>\n<p>\u2022Besonders Gib-Mir-Alles-Ausdr\u00fccke wie \u201eselect o from Entity o\u201c sind gef\u00e4hrlich, da die Anzahl der Objekte gro\u00df sein kann, obwohl nur ein kleiner Teil der Objekte wirklich ben\u00f6tigt wird.  <\/p>\n<p>\u2013Eine Paginierung kann hier sinnvoller sein um nur das zu laden, was zum Beispiel sichtbar ist.  <\/p>\n<p>&nbsp;  <\/p>\n<p>\u2022Einzelne Entities lassen sich nicht aus dem Entity-Manger entfernen (detachen).  <\/p>\n<p>\u2013Bei Hibernate oder anderen Implementierungen funktioniert das, bei JPA standardm\u00e4\u00dfig nicht.  <\/p>\n<p>\u2022Aber andersherum gibt es eine L\u00f6sung.  <\/p>\n<p>\u2013Also alles freigeben, bis auf ausgew\u00e4hlte Objekte.  <\/p>\n<p>\u2022Gibt es einen Verweis auf eine Entity-Objekt vom Persistence Context aus und von au\u00dfen, und wird dann clear() den Persistence Context l\u00f6schen, wird der Garbage-Collector das Objekt nat\u00fcrlich nicht freigeben.  <\/p>\n<p>\u2013Das losgel\u00f6ste Entity-Objekt kann sp\u00e4ter mit merge() wieder in den Persistence Context gesetzt werden. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Persistence Context verwaltet Entities und kontrolliert ihren Lebenszyklus. Man unterscheidet zwei Arten von Persistence Context: \u2013Transaction-scoped Persistence Context \u2013Extended Persistence Context \u2022Mit EntityManagerFactory.createEntityManager() bekommt man den Extended Persistence Context. \u2013createEntityManager() liefert den Application-Managed Entity Manager. \u2022Der Persistence Context beginnt, wenn der Application-Managed Entity Manager erzeugt wird und endet erst dann, wenn der Entity-Manager geschlossen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-86","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/86\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}