Este artículo analiza en detalle el uso de Hibernate para administrar sesiones y operaciones por lotes. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
Hibernate gestiona la sesión
Hibernate en sí proporciona tres métodos para administrar objetos de sesión ① El ciclo de vida del objeto de sesión está vinculado al hilo local ② El ciclo de vida del objeto de sesión está vinculado a la transacción JTA ③ El programa delegado de Hibernate administra el ciclo de vida del objeto de sesión
En el archivo de configuración de Hibernate, el atributo hibernate.current_session_context_class se utiliza para especificar el método de gestión de sesión. Los valores opcionales incluyen:
① subproceso: el ciclo de vida del objeto de sesión está vinculado al subproceso local ② jta *: el ciclo de vida del objeto de sesión está vinculado a la transacción JTA ③ administrado: programa delegado de Hibernate para administrar el ciclo de vida del objeto de sesión
El ciclo de vida del objeto Session está vinculado al hilo local:
Si el valor del atributo hibernate.current_session_context_class del archivo de configuración de Hibernate está configurado en subproceso, Hibernate administrará la sesión de una manera vinculada al subproceso local.
Hibernate vincula la sesión al hilo local de acuerdo con las siguientes reglas:
Cuando un hilo (hilo) llama al método getCurrentSession () del objeto SessionFactory por primera vez, este método creará un nuevo objeto Sesión (sesiónA), vinculará el objeto al hiloA y devolverá la sesión cuando el hiloA vuelva a llamar al objeto SessionFactory. Cuando se utiliza el método getCurrentSession(), este método devolverá el objeto sessionA. Cuando threadA envía la transacción asociada con el objeto sessionA, Hibernate se vacía automáticamente. Almacene en caché el objeto sessionA, luego confirme la transacción y cierre la sesión como desee. Cuando threadA cancela la transacción asociada con el objeto sessionA, el objeto sessionA también se cerrará automáticamente. Si threadA vuelve a llamar al método getCurrentSession() del objeto SessionFactory, este método creará un nuevo objeto Session (sessionB) y vinculará el objeto a. threadA y devolver la sesiónB.
Procesar datos en lotes
El procesamiento por lotes de datos se refiere al procesamiento de una gran cantidad de datos en una transacción y operaciones por lotes en el proceso de la capa de aplicación. Los métodos principales son los siguientes:
① A través de la sesión
② Pasar HQL
③ A través de StatelessSession
④ A través de JDBC API----Recomendado porque es el más rápido
La sesión realiza operaciones por lotes:
Los métodos save() y update() de la sesión almacenarán los objetos procesados en su propia caché. Si se utiliza un objeto de sesión para procesar una gran cantidad de objetos persistentes, los objetos que se han procesado y a los que no se accederá nuevamente deben vaciarse del caché de manera oportuna. El método específico es llamar inmediatamente al método flush () para actualizar el caché después de procesar un objeto o un pequeño lote de objetos, y luego llamar al método clear () para almacenar el caché en caché.
Las operaciones de procesamiento a través de la sesión están sujetas a las siguientes restricciones:
La cantidad de procesamiento por lotes único de JDBC debe establecerse en el archivo de configuración de Hibernate. Se debe garantizar que la cantidad de lotes de declaraciones SQL enviadas a la base de datos cada vez sea consistente con el atributo de tamaño del lote.
Si el objeto utiliza el generador de identificadores de "identidad", Hibernate no puede realizar operaciones de inserción por lotes en JDBC.
Al realizar operaciones por lotes, se recomienda desactivar el caché de segundo nivel de Hibernate.
Demostración de código para la inserción de datos por lotes:
Copie el código y el código es el siguiente: Noticias noticias = nulo;
para(int i = 0; i < 10000; i++) {
noticias = nueva Noticias();
noticias.setTitle("--" + i);
sesión.save(noticias);
si((yo + 1) % 20 == 0) {
sesión.flush();
sesión.clear();
}
}
Actualización por lotes: al realizar una actualización por lotes, obviamente no es recomendable cargar todos los objetos en el caché de sesión a la vez y luego actualizarlos uno por uno en el caché.
Utilice el conjunto de resultados desplazables org.hibernate.ScrollableResults. Este objeto en realidad no contiene ningún objeto, solo el cursor utilizado para localizar registros en línea. Solo cuando el programa atraviesa para acceder a un elemento específico del objeto ScrollableResults, cargará el objeto correspondiente en la base de datos.
El objeto org.hibernate.ScrollableResults es devuelto por el método de desplazamiento de Query
Operaciones por lotes a través de HQL:
Nota: HQL solo admite declaraciones de inserción en forma de INSERT INTO...SELECT, pero no admite declaraciones de inserción en forma de INSERT INTO...VALUES. Por lo tanto, las operaciones de inserción por lotes no se pueden realizar utilizando HQL.
Operaciones por lotes a través de StatelessSession:
Formalmente, el uso de StatelessSession es similar al de Session. En comparación con Session, StatelessSession tiene las siguientes diferencias:
StatelessSession no tiene caché y los objetos cargados, guardados o actualizados a través de StatelessSession están en estado libre.
StatelessSession no interactúa con el caché de segundo nivel de Hibernate. Al llamar a los métodos save(), update() o delete() de StatelessSession, estos métodos ejecutarán inmediatamente la declaración SQL correspondiente en lugar de solo planear ejecutar una declaración SQL.
StatelessSession no realiza comprobaciones sucias, por lo que después de modificar las propiedades del objeto Cliente, debe llamar al método update() de StatelessSession para actualizar los datos en la base de datos.
StatelessSession no realizará ninguna operación en cascada en los objetos asociados. El objeto Cliente con OID 1 se carga dos veces a través del mismo objeto StatelessSession. Las direcciones de memoria de los dos objetos obtenidos son diferentes.
Las operaciones realizadas por StatelessSession pueden ser capturadas por el interceptor Interceptor, pero el sistema de procesamiento de eventos de Hibernate las ignorará.
Espero que este artículo sea útil para la programación Java de todos.