query - Spring JDBCTemplate VS Hibernate en términos de rendimiento
spring jdbctemplate query (4)
En nuestro proyecto, debemos decidir entre Spring JDBCTemplate e Hibernate.
Quiero saber cuál es mejor en términos de rendimiento, implementación y diseño. ¿y cómo?
¿Su diseño de base de datos es hibernate amigable? Si es así, entonces hibernate ... si no, entonces puede querer evitarlo. Jdbctemplate tiene muchas ventajas y hay formas de asegurarse de que sus consultas SQL se mantengan fácilmente. Tenga una clase que los guarde a todos o los lea de un archivo, etc. Si las columnas tienen que actualizarse, hay una forma de usar jdbc estándar para obtener los metadatos del conjunto de resultados que le permiten recuperar los nombres de las columnas. Esto puede ser complejo pero una forma interesante de resolver un problema. Hibernate es una gran herramienta, pero los modelos de datos complejos lo hacen realmente complicado.
En nuestro proyecto, estamos usando ambos, JdbcTemplate
e Hibernate
. Lo que debe hacer es compartir DataSource
entre hibernate
y jdbcTemplate
. Podemos verificar el rendimiento de ambos según las operaciones, lo que sea mejor, utilizamos uno mejor. Principalmente estamos usando hibernación para operaciones normales, si hay grandes consultas u operaciones pesadas, verificamos el rendimiento de jdbc e hibernamos el que mejor lo usemos.
Lo bueno es que HibernateTransactionManager funciona para ambos (JdbcTemplate, plain jdbc) e hibernate.
Eso depende de su proyecto y de cuán bien el modelo de Hibernate se ajuste a su forma de pensar. La velocidad / el rendimiento es irrelevante: si no puede entender cómo funciona Hibernate, su proyecto estará plagado de errores extraños que demorarán en encontrar y solucionar.
También tenga en cuenta que las partes internas de Hibernate se filtrarán en su modelo y DAO. Los puntos notables de conflicto suelen ser equals()/hashCode()
y la carga diferida de colecciones fuera de las transacciones. Dado que los ejemplos con Hibernate son tan simples y puede lograr mucho en poco tiempo, esto puede llevar a la idea errónea de que Hibernate es simple. No es. Hibernate hace muchas suposiciones y te obliga a pensar y codificar de cierta manera.
Usar JdbcTemplate
es más fácil porque es solo una envoltura muy delgada alrededor de JDBC. El precio aquí es que escribirás miles de líneas de código realmente aburrido. Además, encontrará que las cadenas de SQL son realmente difíciles de mantener. Cuando su modelo de datos cambie, tendrá que buscar toda la base de códigos para todos los lugares que puedan verse afectados. No será bonito.
Para nuestro propio proyecto, decidimos no utilizar Hibernate porque tenemos estructuras de datos realmente complejas (estructuras de árbol revisadas) y tenemos que crear consultas de búsqueda complejas en tiempo de ejecución. En cambio, escribimos nuestra propia capa DAO usando jOOQ . jOOQ es una envoltura delgada alrededor de JDBC que te permite escribir SQL con una buena DSL en Java:
create.selectFrom(BOOK)
.where(PUBLISHED_IN.equal(2011))
.orderBy(TITLE)
Al igual que Hibernate, jOOQ tiene algunas reglas que debes seguir o no serás feliz, pero son mucho más indulgentes.
Como otra opción, debería echar un vistazo a Spring Data . En pocas palabras, Spring Data le permite almacenar sus datos en cualquier cosa que se parezca remotamente a una base de datos. Esto significa que puede administrar su modelo con Hibernate y otro con una base de datos NoSQL. O puede migrar fácilmente parte de su modelo según sea necesario.
Una de las características clave es que la implementación de DAO se ve así:
public interface UserRepository extends Repository<User, Long> {
List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}
Ahora puede preguntarse dónde está la implementación, ya que esta es solo una interfaz con una definición de método, pero eso es todo. En tiempo de ejecución, Spring Data generará código para usted que implementa este método. Esto es posible porque el 99% de todas las consultas que necesitará son del formulario "tabla de consulta para todas las filas donde la columna X es ..." por lo que optimizaron este caso de uso.
OTOH, si ya sabes que vas a crear consultas de búsqueda realmente complejas en tiempo de ejecución, Spring Data probablemente no sea de mucha ayuda.
Si hace todo lo posible para que ambas implementaciones sean muy rápidas, la plantilla JDBC probablemente sea un poco más rápida, porque no tiene la sobrecarga que tiene Hibernate. Pero probablemente llevará mucho más tiempo y líneas de código para implementar.
Hibernate tiene su curva de aprendizaje, y usted tiene que entender qué sucede detrás de las escenas, cuándo usar proyecciones en lugar de devolver entidades, etc. Pero si lo domina, ganará mucho tiempo y tendrá un código más simple y más limpio que con un JDBC solución basada en
Diría que en el 95% de los casos, Hibernate es lo suficientemente rápido o incluso más rápido que el código JDBC no optimizado. Por el 5% restante, nada le prohíbe usar otra cosa, como Spring-JDBC, por ejemplo. Ambas soluciones no son mutuamente excluyentes.