Une entité gestionnaire de créer une connexion à la base de données?
Dans mon projet, j'ai oublié de fermer le gestionnaire de l'entité pour chaque opération. Après quelques temps, j'ai exception en raison d'un excès de connexions au serveur mysql. Cela signifie que chaque entité gestionnaire d'établir la connexion? Ce qui arrive quand on oublie de fermer la connexion? J'ai utilisé une seule entité gestionnaire de l'usine.
OriginalL'auteur Ramki | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
En supposant que vous utilisez une application gérés par l'entité gestionnaire, vous êtes responsable de l'initialisation et de clôture, l'entité gestionnaire. L'un de l'autre main, si vous êtes en s'appuyant sur le conteneur pour injecter le gestionnaire d'entités dans votre session de haricots (ou toutes les classes gérées), puis le conteneur est chargé de veiller à ce que le gestionnaire d'entités est fermé.
Généralement, le gestionnaire de l'entité n'est pas responsable pour créer des connexions à la base de données. Il serait au lieu d'utiliser un pool de connexion, qui est définie dans
persistence.xml
. C'est vrai, à la fois JTA les gestionnaires de l'entité et de ressources locales gestionnaires de l'entité; JTA les gestionnaires de l'entité compter sur une source de données JTA fourni par le serveur d'application de l'environnement, tandis que les ressources locales, les gestionnaires de l'entité à créer et à gérer leurs propres piscines.Si vous ne fermez pas les gestionnaires de l'entité, et si vous continuez à créer de nouvelles instances d'entre eux, alors il est possible pour vous d'échappement des connexions à la source de données JTA (JTA les gestionnaires de l'entité) ou frappé d'un serveur défini de limite sur les connexions client (pour les deux JTA et les ressources locales, les gestionnaires de l'entité). Chaque instance de base de données doit être configuré pour accepter pas plus qu'un certain nombre de connexions. Si le nombre de connexions établies par tous les clients, dépasse cette limite, le serveur il suffit de déposer plus de connexions. Si vous ouvrez l'entité gestionnaire de cas que la demande pour plus de connexions à partir d'un pool (JTA les gestionnaires de l'entité), ou de créer de nouveaux bassins (pour les ressources locales, les gestionnaires de l'entité), alors il est très probable que la piscine elle-même pourriez être fatigué, ou trop grand nombre de connexions aurait été ouvert.
Puisque vous ne pouvez pas fermer les connexions directement, ou même de redimensionner les pools de connexion à partir de votre application, il est bien évident que vous devez fermer l'entité gestionnaire de cas, lorsque vous n'avez plus besoin d'eux; cela permettra de libérer automatiquement les liens qui ont été établis pour le gestionnaire de l'entité.
Aussi, il serait sage de chercher à l'aide d'une écoute et d'une taille suffisante pool de connexion pour chaque entité gestionnaire de l'instance, dans le cas où vous êtes en utilisant les ressources locales, les gestionnaires de l'entité pour une raison. Si vous utilisez un JTA entité gestionnaire, envisager l'utilisation de conteneur d'injection de gestionnaires d'entités et d'une source de données JTA qui est soutenue par une écoute et d'une taille suffisante pool de connexion.
OriginalL'auteur Vineet Reynolds
Dans tous les cas, si vous avez explicitement ouvert EntityManager (l'obtenir à partir d'EMFactory), alors vous devriez la fermer. Si elle prend de connexion (ce qui semble être votre cas) ou pas ne dépend pas des paramètres qui est plutôt JPA liées aux fournisseurs. Sur notre projet, EM ouvre la connexion à chaque requête et renvoie immédiatement (ferme). Mais il y a d'autres options - garder la connexion, ou la connexion qui suit cycle de vie des transactions.
Titre d'exemple, voici paramètres pour OpenJPA. Je dirais que si EM ouverture de la connexion pour la requête/transaction, que vous ne frappez pas le problème. Il semble que votre EM prend la connexion et qu'elle détient.
Dans tous les cas, vous devez fermer l'EM si vous l'avez créé. La meilleure pratique est de le faire dans la même méthode, si possible, de sorte qu'il est facile d'examiner l'exactitude, et de le faire dans le bloc finally.
OriginalL'auteur virgo47