Les Sessions Hibernate et les Transactions avec les Threads
Je suis en train de travailler sur un projet qui utilise Hibernate3 et JDBC pour se connecter/interagir avec notre base de données (MSSQL 2008)
Actuellement, nous créons notre session d'usine dans notre classe principale alors commencer notre transaction, alors nous commençons un nouveau thread et le thread crée des connexions et de ce pas. Je vais voir si je peut illustrer cela avec certains pseudo-code...
public static main(String[] args){
for(...){
SessionFactory sf = new SessionFactory();
sf.getCurrentSession.beginTransaction();
CreateNewThreadedObject.run();
sf.getCurrentSession.getTransaction.commit();
}
}
Ma question est, est-ce sécuritaire? Je sais que les sessions ne sont pas thread-safe, mais je ne suis pas vraiment à l'aide de la session dans le fil. Si tout ce que je suis en utilisant la Transaction. Serait de passage de la sessionfactory à la filetée objet de mieux? Tout avis est apprécié!
OriginalL'auteur Shaded | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Il est très important que vous compreniez les Sessions Hibernate de fil et d'association, mieux expliqué ici:
http://community.jboss.org/wiki/Sessionsandtransactions
Si vous travaillez avec une application web, je vous recommande vivement l'Open Session in View motif:
https://community.jboss.org/wiki/OpenSessionInView
OriginalL'auteur kvista
Vous pouvez initialiser un singleton SessionFactory. C'est effectivement recommandé.
Ensuite, chaque thread doit créer une Session à l'aide de la fabrique de session et d'effectuer des transaction(s).
C'est en fait très commun motif est utilisé dans les applications web. L'Open Session in View motif que @kvista mentionne, est essentiellement un filtre de servlet qui crée une session, commence une transaction, les délégués à ce que continue le traitement de la requête et à la fin, valide ou annule la transaction. Et depuis, chaque demande est traitée par un autre thread dans un conteneur de servlet, vous pouvez voir comment fermer les deux cas sont.
Dans votre cas, il ne serait pas déraisonnable de s'exécuter de nombreuses opérations dans chaque thread. C'est en fait l'idée de base de l'exécution d'un processus de traitement par lots dans un environnement multi-thread (idéalement JTA) de l'environnement. Une chose que vous devriez noter, cependant, est que la session est en fait un contexte de persistance qui agit comme un cache, et vous devriez le supprimer de temps en temps pour éviter les fuites de mémoire.
OriginalL'auteur dkateros