2010-03-29 5 views
13

¿Solo me pregunto si comenzar una nueva transacción en Hibernate realmente asigna una conexión al DB?¿beginTransaction en Hibernate asigna una nueva conexión de base de datos?

Me preocupa b/c nuestro servidor comienza una nueva transacción para cada solicitud recibida, incluso si esa solicitud no interactúa con la base de datos. Estamos viendo las conexiones a bases de datos como un cuello de botella importante, por lo que me pregunto si debería tomar el tiempo para limitar el alcance de mis transacciones.

Ha buscado en todas partes y no he podido encontrar una buena respuesta. El código muy simple está aquí:

SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory"); 
    sessionFactory.getCurrentSession().beginTransaction(); 
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO); 

muchas gracias! un

Respuesta

8

(Actualizado por el comentario de Pascal Thivent)

Cada Session crea una conexión de base de datos si hay una necesidad de que - por ejemplo, si se inicia una transacción. La conexión no se abre con la mera creación de la sesión.

Para solucionar esto, puede usar un connecetion pool para que las conexiones se reutilicen. O puede asegurarse (como parece haberlo hecho) de que ninguna transacción se inicie automáticamente.

(This analiza las transacciones de sólo lectura Tome una mirada..)

+0

Gracias, ya estamos usando un grupo de conexiones. Al no iniciar una transacción de manera predeterminada pudimos reducir masivamente la carga en nuestra base de datos. – illscience

+1

En realidad, la conexión tiene una carga lenta en una 'Sesión'. Ver mi respuesta para más detalles. –

+0

@Pascal Thivent hm, interesante y lógica :) @illscience por favor, cambie la respuesta aceptada – Bozho

14

De acuerdo con la sección 11.1. Session and transaction scopes de la documentación de Hibernate:

Un SessionFactory es un cara-a-crear, multi-hilo objeto, destinado a ser compartido por todos los hilos de aplicación . Se crea una vez, generalmente al iniciar la aplicación, desde una instancia Configuration.

A Session es un objeto de bajo costo, no threadsafe que debe ser utilizarse una vez y luego se descarta para: a solicitud individual, una conversación o una sola unidad de de trabajo. A Session no obtendrá un JDBC Connection, o un Datasource, a menos que sea necesario. Es no consumirá ningún recurso hasta que se use .

Para reducir la contención de bloqueo en la base de datos, una transacción de base de datos tiene que ser lo más corta posible. Las transacciones largas de la base de datos evitarán que su aplicación escale a una carga muy concurrente de . No es se recomienda que mantenga abierta una transacción de base de datos durante el tiempo de espera del usuario hasta que la unidad de trabajo sea completa.

Ahora, para responder a su pregunta:

  • conseguir un Session hace no adquirir inmediatamente una conexión (la conexión está cargado ligeramente)
  • pero llamar beginTransaction() hará que la carga de la conexión para el dado Session
  • llamadas subsiguientes reutilizarán el mismo connection

Mire org.hibernate.impl.SessionImpl#beginTransaction() y revise el código para obtener más detalles.

+0

+1, por supuesto (15chrs) – Bozho

+0

@Bozho ¡Gracias! –

+0

gracias. Buena respuesta –

Cuestiones relacionadas