19 Methoden in unserer DAO Schicht Es gibt jeweils eine gewisse Variation dieses:Wie können EntityManager-Verbindungen ordnungsgemäß geschlossen werden?
public TicketProp saveTicketProp(TicketProp prop) {
EntityManager em = this.emf.createEntityManager();
try {
em.getTransaction().begin();
prop = (TicketProp) em.merge(prop);
em.getTransaction().commit();
return prop;
} finally {
em.close();
}
}
Bedeutung: Bei jedem Verfahren wir unsere eigene Transaktion handhaben und schließen Sie es in einen finally-Block. Wir testen eine Jersey-App, daher erweitern unsere JUnit-Tests JerseyTest. Jede Testmethode instanziiert einen Grizzly-Container, führt den Test aus und fährt den Container dann herunter. EntityManagerFactory wird im Frühling injiziert. Wir verwenden JPA über Hibernate.
Ich überwache die Verbindungen zu unserer MySQL-Test-DB und sie sind immer hoch. Bei einem Test wird die MySQL-Variable "Max_used_connections" auf 38 gesetzt. Um Spaß zu haben, habe ich alle Aufrufe von em.close() auskommentiert, und der Test verwendet immer noch 38 Verbindungen.
Ich benutze Hibernate eingebaute Verbindungspooling (nicht für Prod verwenden, ich weiß). Ich erwartete immer noch eine Art von intelligentem Pooling.
Behandle ich den EntityManager falsch? Wie sonst kann ich Verbindungen schließen?
em.close nur freigeben, um die Verbindung zu Verbindungspool. emf.close schließt alle Verbindungen. Es kann also sein, dass zu viel emf in der Anwendung erzeugt wird, also zu viele Verbindungen. – Scarlett