Macht ein entity-manager-erstellen Sie eine Verbindung zu der Datenbank?
In meinem Projekt habe ich vergessen, in der Nähe der entity-manager für jede operation. Nach einiger Zeit bekam ich die Ausnahme aufgrund übermäßigem verbindungen zum mysql-server. Bedeutet das, dass jeder entity-manager die Verbindung herzustellen? Was passiert, wenn wir vergessen, um die Verbindung zu schließen? Ich habe nur eine entity manager factory.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Davon aus, dass du mit einem application-managed entity manager, dann sind Sie verantwortlich für die Initialisierung und das schließen des entity MANAGERS. Einer der anderen Seite, wenn Sie unter Berufung auf den Behälter zu injizieren und den entity-manager in Ihrem session-beans (oder jeder verwalteten Klassen), dann wird der container ist dafür verantwortlich, dass der entity-manager geschlossen wird.
In der Regel die entity-manager ist nicht verantwortlich für das erstellen von verbindungen zur Datenbank. Wäre es stattdessen mit einem connection pool, definiert ist, in
persistence.xml
. Dies gilt sowohl JTA-entity-Manager und resource-local-entity-Manager; JTA entity-Manager verlassen sich auf eine JTA-datasource zur Verfügung gestellt von der application-server-Umfeld, während die resource-local entity Manager erstellen und verwalten Ihre eigenen pools.Wenn Sie nicht in der Nähe entity-Manager, und wenn Sie weiterhin zum erstellen neuer Instanzen von Ihnen, dann ist es möglich für Sie zu erschöpfen verbindungen in die JTA-datasource (für JTA-entity-Manager) oder auf eine server definierten Grenze auf client-verbindungen (sowohl für die JTA-und resource-local-entity-Manager). Jede Datenbank-Instanz so konfiguriert werden, akzeptieren nicht mehr als eine bestimmte Anzahl von verbindungen. Wenn die Anzahl der verbindungen, die von allen clients, die diese Grenze überschreitet, wird der server einfach fallen neben verbindungen. Wenn Sie öffnen Sie die entity-manager-Instanzen, die Anfrage für zusätzliche verbindungen, die aus einem pool (für JTA-entity-Manager), oder erstellen Sie neue pools (für resource-local-entity-Manager), dann ist es sehr viel wahrscheinlicher, dass der pool selbst könnte erschöpft sein, oder zu viele verbindungen geöffnet worden sind.
Da können Sie nicht schließen Sie die verbindungen, die direkt, oder sogar die Größe des verbindungspools von Ihrer Anwendung aus, es ist ziemlich offensichtlich, dass Sie schließen müssen entity-manager-Instanzen, wenn Sie Sie nicht mehr benötigen; dies wird automatisch die release-verbindungen, die gegründet wurden, für den entity-manager.
Auch, es wäre klug, zu schauen, mit einem gut abgestimmten und ausreichend dimensionierten connection pool für jeden entity-manager-Instanz, im Fall Sie sind mit resource-local-entity-Manager für einen Grund. Wenn Sie mit einer JTA-entity-manager, ziehen Sie die Verwendung container-injiziert entity-Manager und eine JTA-datasource, die ist gesichert durch eine gut abgestimmte und ausreichend dimensionierten connection pool.
In jedem Fall - wenn Sie explizit öffnen EntityManager (bekommen Sie von EMFactory), dann sollten Sie es schließen. Ob es nimmt Verbindung (das scheint in Ihrem Fall) oder nicht, hängt von Einstellungen, dass das nicht der JPA-provider im Zusammenhang. In unserem Projekt EM-öffnet die Verbindung für jede Abfrage und gibt Sie sofort zurück (schließt sich). Aber es gibt andere Optionen, um die Verbindung oder einer Verbindung, die folgt, transaction lifecycle.
Als Beispiel sind hier Einstellungen für OpenJPA. Ich würde sagen, dass wenn die EM eröffnet wird die Verbindung für den query/Transaktion, als würde man nicht treffen, das problem. Es scheint, dass Ihre EM nimmt die Verbindung auf und hält Sie.
In jedem Fall sollten Sie in der Nähe der EM, wenn Sie Sie erstellt haben. Beste Praxis ist, in der gleichen Methode, wenn möglich, so dass es leicht zu überprüfen, die Richtigkeit, und dies im finally-block.