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
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.
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.
- 1. conexión tiene una base de datos remota
- 2. Retraso en la conexión a la base de datos C#
- 3. Conexión a la base de datos de Python Cerrar
- 4. Conexión a la base de datos MySQL en el servidor
- 5. Variable global - conexión a la base de datos?
- 6. ¿Cómo puedo asegurar mi conexión a la base de datos?
- 7. Eliminar entidades html de una base de datos
- 8. Cómo obtener la conexión Cadena de una base de datos
- 9. CouchDB crea una base de datos por tipo de documento?
- 10. Android - Conexión a la base de datos MySQL
- 11. ¿Cómo insertar valores en la base de datos usando consultas usando el administrador de entidades, persistencia usando una clase java?
- 12. Generador de entidades de la base de datos
- 13. Cómo generar objetos @Entidades de la base de datos?
- 14. conexión de base de datos compartida frente a conexiones de base de datos privadas
- 15. Conexión de base de datos heterogénea
- 16. Cómo obtener los metadatos de la base de datos desde el administrador de la entidad
- 17. SQLiteOpenHelper: ¿cómo se crea la base de datos?
- 18. Forma de Java EE/JPA para agregar nuevas tablas/entidades a la base de datos
- 19. ¿Cómo conectar Django a una base de datos mysql a través de una conexión SSL?
- 20. DBI: Conectarse a una base de datos diferente si la primera base de datos no existe
- 21. Multithreading y conexión (es) a base de datos
- 22. Administrar la conexión a la base de datos en una aplicación asp.net
- 23. informes de Crystal - cerrar la conexión de base de datos
- 24. Diseño de base de datos de entidades de múltiples versiones
- 25. transacciones y administrador de entidades symfony2
- 26. Conexión a base de datos a partir de una extensión de Chrome?
- 27. Obtener conexión a la base de datos desde un grupo de conexiones
- 28. Conexión agrupación con la base de datos de Access
- 29. ¿Cómo se define una cadena de conexión a una base de datos de SQL Server 2008?
- 30. ¿El administrador de transacciones de Spring vincula una conexión a un hilo?