2008-12-02 11 views
6

Tengo un proceso por lotes diario que implica seleccionar una gran cantidad de registros y formatear un archivo para enviarlo a un sistema externo. También necesito marcar estos registros como enviados para que no se vuelvan a transmitir mañana.¿Hibernate es bueno para el procesamiento por lotes? ¿Qué hay del uso de la memoria?

En mi forma ingenua de JDBC, preparaba y ejecutaba una declaración y luego comenzaba a recorrer el conjunto de registros. Como solo avanzo en el conjunto de registros, no hay necesidad de que mi servidor de aplicaciones mantenga todo el conjunto de resultados en la memoria al mismo tiempo. Los grupos de registros se pueden alimentar desde el servidor de la base de datos.

Ahora, digamos que estoy usando hibernate. ¿No terminaré con un grupo de objetos que representan todo el conjunto de resultados en la memoria a la vez?

Respuesta

5

Hibernate también itera sobre el conjunto de resultados para que solo se mantenga una fila en la memoria. Este es el predeterminado. Si se carga con avidez, debes decírselo.

Razones para utilizar Hibernate:

  • "Alguien" era "creativo" con los nombres de columna (PRXFC0315.XXFZZCC12)
  • El diseño de DB es todavía en proceso de cambio y/o si desea un lugar donde la columna los nombres están mapeados a Java.
  • Estás usando Hibernate todos modos
  • tienes consultas complejas y no estás con fluidez en SQL

Razones no utilizar Hibernate:

  • El resto de su aplicación es JDBC puro
  • No necesita nada de la potencia de Hibernate
  • Tiene consultas complejas y habla con fluidez SQL
  • Se necesita un rasgo específico de su base de datos para hacer el SQL realizar
1

En mi opinión lo haría NO uso de hibernación, ya que hace que su aplicación mucho más grande y menos mantenible y no se sabe muy tener la posibilidad de optimizar los scripts sql generados de manera rápida. Además, podría usar todas las funciones SQL que JDBC-bridge admite y no están limitadas a la funcionalidad de hibernación. Otra cosa es que también tienes las limitaciones que vienen con cada capa de código heredado.

Pero al final es una pregunta filosófica y debes hacerlo de la manera que mejor te parezca.

0

Si hay posibles problemas de rendimiento, entonces quédese con el código JDBC.

Existen varias optimizaciones de SQL puro conocidas que que serían muy difíciles de hacer en Hibernate.

¡Solo seleccione las columnas que use! (Sin cosas "select *").

Mantenga el SQl lo más simple posible. p.ej. No incluya tablas de referencia pequeñas como códigos de moneda en la combinación. En su lugar, cargue la tabla de monedas en la memoria y resuelva las descripciones de moneda con una búsqueda de programa.

Depende del reordenamiento menor de DBMS del SQL donde los predicados pueden tener un efecto importante en el rendimiento.

Si está actualizando/insertando, solo debe confirmar cada 100 a 1000 actualizaciones. es decir, no comprometas todas las unidades de trabajo, sino que conserves un contador, por lo que te comprometes con menos frecuencia.

Aproveche las funciones agregadas de su base de datos. Si desea totales por código DEPT, hágalo en el SQL con "SUMA (cantidad) ... GROUP BY DEPT".

+0

Cambiar la proyección es muy fácil en Hibernate, puede recuperar la lista modelando una cuadrícula de resultados relacionales, o hacer que Hibernate cree una instancia de un objeto específico para usted usando SQL nativo o HQL. Las funciones de agregado y GROUP BY también están disponibles en la API de Criteria y en HQL. –

2

Hibernar como cualquier marco ORM está diseñado para desarrollar y mantener sistemas basados ​​en el principio de programación orientada a objetos. Pero la mayoría de las bases de datos son relacionales y no están orientadas a objetos, por lo que, en cualquier caso, ORM es siempre una compensación entre la programación OOP conveniente y el acceso a BD optimizado/más eficaz.

No utilizaría ORM para tareas aisladas específicas, sino más bien como una opción arquitectónica general para la capa de persistencia de la aplicación.

3

Hibernate ofrece algunas posibilidades para mantener la sesión pequeña.

Puede usar Query.scroll(), Criteria.scroll() para el desplazamiento de tipo JDBC. Puede usar Session.evict (entidad Object) para eliminar entidades de la sesión. Puede usar una sesión sin estado para suprimir la comprobación sucia. Y hay algunas optimizaciones de rendimiento más, consulte la documentación de Hibernate.

Cuestiones relacionadas