2011-07-25 17 views
6

En mi proyecto, olvidé cerrar el administrador de entidades para cada operación. Después de un tiempo, obtuve una excepción debido a conexiones excesivas al servidor de MySQL. ¿Esto significa que cada administrador de la entidad establece la conexión? ¿Qué pasará cuando nos olvidemos de cerrar la conexión? Solo he usado una fábrica de administrador de entidades.¿Un administrador de entidades crea una conexión a la base de datos?

Respuesta

9

Suponiendo que está utilizando un gestor de entidad de aplicación gestionados, entonces usted es responsable de la inicialización y cerrar el gestor de la entidad. Por otro lado, si confía en el contenedor para inyectar el administrador de entidades en sus beans de sesión (o cualquier clase administrada), entonces el contenedor es responsable de asegurarse de que el administrador de entidades esté cerrado.

Por lo general, el gestor de la entidad no es responsable de la creación de conexiones a la base de datos. En su lugar, usaría un grupo de conexiones, que se define en persistence.xml. Esto es cierto tanto para los gerentes de entidades JTA como para los gerentes de entidades locales de recursos; Los administradores de entidades de JTA confían en un origen de datos JTA proporcionado por el entorno del servidor de aplicaciones, mientras que los gerentes de entidades locales de recursos crean y administran sus propios grupos.

Si no cierra los administradores de entidad, y si continúa creando nuevas instancias de ellos, entonces es posible que agote las conexiones en el origen de datos JTA (para administradores de entidades JTA) o alcance un límite definido por el servidor conexiones de cliente (para administradores de entidades JTA y de recursos locales). Cada instancia de base de datos se configuraría para aceptar no más de un cierto número de conexiones. Si la cantidad de conexiones establecidas por todos los clientes excede este límite, el servidor simplemente eliminará las conexiones adicionales. Si abre instancias de administrador de entidades que solicitan conexiones adicionales desde un grupo (para administradores de entidades JTA) o crea nuevos grupos (para administradores de entidades locales de recursos), entonces es muy probable que el grupo mismo se agote, o también muchas conexiones se habrían abierto.

Puesto que no puede cerrar las conexiones directamente, o incluso cambiar el tamaño de las agrupaciones de conexiones desde la aplicación, es bastante obvio que debe cerrar instancias del gestor de la entidad cuando ya no los necesita; esto liberará automáticamente las conexiones que se establecieron para el administrador de la entidad.

Además, sería aconsejable utilizar un conjunto de conexiones bien ajustado y de tamaño adecuado para cada instancia de administrador de entidades, en caso de que esté utilizando administradores de entidades locales de recursos por algún motivo. Si está utilizando un administrador de entidades JTA, considere el uso de administradores de entidades con inyección de contenedores y un origen de datos JTA respaldado por un grupo de conexiones bien ajustado y de tamaño adecuado.

3

En cualquier caso - si se abre explícitamente EntityManager (obtenerlo de EMFactory), entonces usted debe cerrarla. Si se necesita conexión (lo que parece ser su caso) o no, depende de configuraciones que están más bien relacionadas con el proveedor de JPA. En nuestro proyecto, EM abre la conexión para cada consulta y la devuelve inmediatamente (se cierra). Pero hay otras opciones: mantener la conexión o conexión que sigue al ciclo de vida de la transacción.

A modo de ejemplo, aquí están settings for OpenJPA. Yo diría que si EM abriera la conexión para consulta/transacción, entonces no llegaría al problema. Parece que su EM toma la conexión y la mantiene.

En cualquier caso, se debe cerrar la EM si lo creó. La mejor práctica es hacerlo en el mismo método si es posible, por lo que es fácil revisar la corrección, y hacerlo en bloque finalmente.

Cuestiones relacionadas