2012-05-21 6 views
1

Salut j'ai une application dans laquelle je veux sélectionner des données de la table et si pas trouvé générer une nouvelle valeur et insérer dans la base de données, puis à nouveau les statistiques de boucles sur vérifier la valeur suivante et ainsi de suite. Cela sera fait autour de milliards de fois pour une nouvelle demande.Utiliser Hibernate ou non?

Alors devrais-je utiliser hibernate ou JDBC ??

et mise en veille prolongée dois-je utiliser

session.saveOrUpdate(obj); 

ou

 session.save(obj); 

et une chose que je voudrais poser est que pour chaque insert dois-je initialiser mon objet de classe de table (new Mytable)? de seulement définir les valeurs fera?

comme

MyTable obj=new Mytable(); 
    obj.setName("dasd"); 
    obj.set... 

obj.save(); 

ou puis-je initialiser juste une fois

`MyTable obj=new Mytable();` 

and in a loop put 
for(... 
obj.setName("dasda"); 
obj.save 

) 
+0

peut-être ce blog peut vous aider. http://codingandmore.blogspot.com/2010/01/how-to-handle-400-billion-rows-in.html –

+1

Un milliard c'est beaucoup. –

Répondre

4

Je suppose/espère que around a billion times est une figure de style parce que si ce n'est pas le cas, c'est sûr que beaucoup d'opérations ainsi vous pourriez vouloir vérifier votre conception. Cela étant dit, comme pour votre première question, je recommanderais Hibernate car il est essentiellement construit au-dessus de JDBC et vous fournit des choses plus pratiques telles que vous faire écrire des requêtes indépendantes de la base de données, ce qui signifie que vous n'avez pas besoin de -Ecrivez vos requêtes si vous changez votre base de données.

Selon votre deuxième question, cela dépend vraiment de ce que vous voulez faire:

Selon cette API:

saveOrUpdate

vide saveOrUpdate (objet Object) lancers francs HibernateException

Soit enregistrer (Object) ou mettre à jour (Object) l'instance donnée, en fonction de la résolution du contrôles de valeur non enregistrée (voir le manuel pour la discussion de la valeur non enregistrée ).Cette opération cascade vers les instances associées si l'association est mappée avec cascade = "save-update".

Paramètres: objet - un transitoire ou instance détachée contenant nouveau ou mis à jour l'état Jetés: HibernateException Voir aussi: save (java.lang.Object), mise à jour (objet Object)

save

sauver

Serializable sauver (objet Object) lancers francs HibernateException

Conserver l'instance transitoire donnée en affectant d'abord un identificateur généré. (Ou en utilisant la valeur actuelle de la propriété d'identifiant si le générateur assigné est utilisé.) Cette opération cascades à instances associées si l'association est mappée avec cascade = "save-update". Paramètres: objet - une instance transitoire d'une classe persistante Returns: l'identifiant généré Lancers: HibernateException

Selon votre troisième question, vous devez fournir plus d'informations. Vous pouvez définir des valeurs pour éviter d'écrire des valeurs null dans votre base de données, mais cela dépend vraiment de votre application et du contexte dans lequel elle sera implémentée.

+0

question a été mise à jour, et enregistre également plus vite saveOrUpdate? – Harinder

+2

@Dennis: Je pense que 'save' devrait être plus rapide car il ne fait aucun contrôle, cependant, si vous essayez d'enregistrer quelque chose qui est déjà dans la base de données, il pourrait y avoir des exceptions. saveOrUpdate' en premier lieu. – npinti

+0

@Dennis a vu que vous me demandiez la même chose, était sur le point de vous donner la même réponse :) – alegen

1
1) So should i use hibernate or simple JDBC ?? 

Si vous connaissez votre chemin mise en veille prolongée autour Je dirais d'y aller, sinon utiliser uniquement si vous avoir assez de temps et de ressources pour l'apprendre. Le fait est que si vous l'utilisez bien, il peut être votre meilleur ami, sinon ce ne sera qu'une source constante de douleur.

2) and in hibernate should i use 

    session.saveOrUpdate(obj); 
or 

    session.save(obj); 

Pour cette question, vous pouvez lire le JavaDoc trouvé here. Un extrait:

save(Object object) 
Persist the given transient instance, first assigning a generated identifier. 

et

saveOrUpdate(Object object) 
    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking). 

La troisième question que je ne comprends pas vraiment, s'il vous plaît développer.

+0

question a été mise à jour, et enregistre également plus vite saveOrUpdate? – Harinder

5
  1. Mise en veille prolongée est un OR Mapping tool. En termes plus simples, il objective la couche de données dans vos applications de sorte que vous n'avez pas à traiter avec les complexités d'interaction de base de données. Cela dit, il existe des situations dans lesquelles l'hibernation peut ne pas être un bon choix.

  2. Si vous schéma est très simple (moins de 8-10 tables) et ne dispose pas des relations très complexes entre eux, puis mise en veille prolongée l'utilisation sera légèrement exagéré pour ce scénario.

  3. Si la taille des données vous essayez travailler est très grande (dans l'ordre de mn/milliards), là aussi l'utilisation de l'utilisation de mise en veille prolongée est déconseillée. La bonne vieille JDBC est mieux ici

  4. Si votre application utilise beaucoup de données statiques puis de mise en cache serait une bonne option et mise en veille prolongée la mise en cache de support de manière transparente.

Donc tout dépend de quel type de scénario que vous avez. Vous pouvez toujours créer saveOrUpdate(obj); en utilisant JDBC.

1

Comme la plupart de vos questions ont déjà été répondues, laissez-moi répondre à votre dernière question. Oui, vous devez créer un nouvel objet, chaque nouvel objet (idéalement, s'il n'y a pas de dépendance associée) sera une nouvelle ligne dans db. Donc, vous devez créer un nouvel objet -> définir des valeurs -> l'associer à la session hibernate -> et l'enregistrer dans db.Si vous voulez insérer des lignes différentes dans db alors oui, vous devez créer différents objets.

Espérons que cela aide.

+0

merci pour l'info. – Harinder

1

Notez également les aspects techniques sous tapis de Hibernate.

  1. Il construit schéma de réflexion pour les propriétés appeler (soit des accesseurs ou des champs
  2. Hibernate génère requête SQL de toute façon et lit les données à partir des données établies et appelle ensuite les méthodes de réflexion afin d'attribuer la valeur recherchée sur.
  3. Si vous avez rempli une propriété qui est un key- Hibernate va d'abord prendre pour la requête de formation (encore une seule opération)

Alors, mise en veille prolongée ne twice- opération au moins lors du chargement supplémentaire et un objet persistant. vraiment- il en fait beaucoup plus.Ainsi, une fois que vous utilisez le travail avec la base de données en mode fonctionnel et non en mode flux de travail, vous pouvez lire les données de l'ensemble de données (Hibernate fera de même) et le conserver dans les variables locales. Travailler avec une variable est plus rapide que d'utiliser des tables de recherche d'objets. Pourtant, une circonstance: tout JPA mappe une classe à la table. C'est bien, une fois que vous construisez votre base de données à partir de zéro ou si la base de données a une conception appropriée. Que faire si vous avez besoin de fusionner des champs à partir de tables de nombre? Cependant, le Hibernate a une annotation @OneToOne à insérer et un objet correspondant à une autre table. Et pourtant, une fois que le Hibernate fera le cycle de travail pour l'objet lié un-à-un, quand vous avez besoin de quelques champs. En un mot, calculez les opérations si la performance est le critère ultime: vous devez au moins 2 temps pour appeler l'ensemble de données. Mise en veille prolongée est pour les opérations de flux de travail lourd, lorsque vous avez des avantages en raison de:

  1. Vous plusieurs fois lu un champ de l'objet non pas de jeu de données
  2. Il est préférable de libérer ensemble de données qui est beaucoup plus lourd que toutes les données objet