web-dev-qa-db-fra.com

Spring JDBCTemplate VS Hibernate en termes de performances

Dans notre projet, nous devons choisir entre Spring JDBCTemplate et Hibernate. 

Je veux savoir lequel est le meilleur en termes de performance, implémentation et conception. Et comment?

35
Amruta

Si vous faites tout votre possible pour rendre les deux implémentations très rapides, le modèle JDBC sera probablement un peu plus rapide, car il n’est pas surchargé par Hibernate. Mais cela nécessitera probablement beaucoup plus de temps et de lignes de code. 

Hibernate a sa courbe d'apprentissage et vous devez comprendre ce qui se passe dans les coulisses, quand utiliser des projections au lieu de renvoyer des entités, etc. Mais si vous le maîtrisez, vous gagnerez beaucoup de temps et aurez un code plus propre et plus simple qu'avec un JDBC. solution basée sur. 

Je dirais que dans 95% des cas, Hibernate est assez rapide, voire même plus rapide que le code JDBC non optimisé. Pour les 5% restants, rien ne vous interdit d'utiliser autre chose, comme Spring-JDBC par exemple. Les deux solutions ne sont pas mutuellement exclusives.

46
JB Nizet

Cela dépend de votre projet et de l'adéquation du modèle Hibernate avec votre façon de penser. La vitesse/performance est sans importance: si vous ne pouvez pas comprendre le fonctionnement d'Hibernate, votre projet sera parsemé de bugs étranges qu'il faudra des années pour trouver et corriger.

Notez également que les composants internes d'Hibernate s'infiltreront dans votre modèle et vos DAO. Les points de conflit notables sont généralement equals()/hashCode() et le chargement paresseux des collections en dehors des transactions. Étant donné que les exemples avec Hibernate sont si simples et que vous pouvez réaliser beaucoup de choses en peu de temps, cela peut conduire à une idée fausse que Hibernate est simple. Ce n'est pas. Hibernate fait beaucoup d'hypothèses et vous oblige à penser et à coder d'une certaine manière.

Utiliser JdbcTemplate est plus facile car il s’agit d’un très mince wrapper autour de JDBC lui-même. Le prix ici est que vous allez écrire des milliers de lignes de code vraiment ennuyeux. En outre, vous constaterez que les chaînes SQL sont très difficiles à maintenir. Lorsque votre modèle de données change, vous devez rechercher dans votre base de codes complète tous les emplacements susceptibles d’être affectés. Ce ne sera pas joli.

Pour notre propre projet, nous avons décidé de ne pas utiliser Hibernate parce que nous avons des structures de données très complexes (arborescences révisées) et que nous devons créer des requêtes de recherche complexes au moment de l'exécution. Au lieu de cela, nous avons écrit notre propre couche DAO en utilisant jOOQ . jOOQ est un fin wrapper autour de JDBC qui vous permet d'écrire du SQL avec un Nice DSL en Java:

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

Comme Hibernate, jOOQ a quelques règles que vous devez suivre sinon vous ne serez pas heureux mais celles-ci sont beaucoup plus clémentes.

Une autre option est de regarder Spring Data . En un mot, Spring Data vous permet de stocker vos données dans tout ce qui ressemble à distance à une base de données. Cela signifie que vous pouvez gérer votre modèle avec Hibernate et un autre en utilisant une base de données NoSQL. Ou vous pouvez facilement migrer une partie de votre modèle selon vos besoins.

L'une des caractéristiques clés est que DAO implementation ressemble à ceci:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

Maintenant, vous pouvez vous demander où est l'implémentation puisqu'il ne s'agit que d'une interface avec une définition de méthode, mais c'est tout. Au moment de l'exécution, Spring Data générera pour vous un code qui implémente cette méthode. Cela est possible car 99% des requêtes dont vous aurez besoin sont de la forme "table de requête pour toutes les lignes où la colonne X est ...". Elles ont donc optimisé ce cas d'utilisation.

OTOH, si vous savez déjà que vous allez créer des requêtes de recherche très complexes au moment de l'exécution, Spring Data ne vous aidera probablement pas beaucoup.

34
Aaron Digulla

Dans notre projet, nous utilisons à la fois JdbcTemplate et Hibernate. Ce que vous devez faire est de partager DataSource entre hibernate et jdbcTemplate. Nous pouvons vérifier les performances des deux en fonction des opérations, celle qui est la meilleure, nous l’utilisons mieux. La plupart du temps, nous utilisons hibernate pour des opérations normales. S'il y a de grandes requêtes ou des opérations lourdes, nous vérifions les performances de jdbc et nous hibernons selon la meilleure méthode.

Le bon point est HibernateTransactionManager fonctionne à la fois (JdbcTemplate, plain jdbc) et hibernate.

15
Nandkumar Tekale

La conception de votre base de données est-elle hibernée? Si oui, utilisez le mode veille prolongée ... sinon, vous voudrez peut-être l'éviter. Jdbctemplate a de nombreux avantages et il existe des moyens de vous assurer que vos requêtes SQL sont facilement maintenues. Ayez une classe qui les contient tous ou lisez-les à partir d'un fichier, etc. Si les colonnes doivent être mises à jour, il existe un moyen d'utiliser jdbc standard pour obtenir des métadonnées de jeu de résultats vous permettant d'extraire les noms de colonnes. Cela peut être complexe mais un moyen intéressant de résoudre un problème. Hibernate est un excellent outil, mais des modèles de données complexes compliquent grandement les choses.

0
Pasha Utt