1. Transactions déclaratives de printemps
1.1 Gestionnaire de transactions de Spring
Spring ne gère pas directement les transactions, mais délègue la responsabilité de la gestion des transactions aux implémentations de transactions d'une plate-forme spécifique fournie par JTA ou des mécanismes de persistance correspondants. Le conteneur à ressort est responsable du fonctionnement des choses, le conteneur de ressort agit comme un visage et la méthode de transaction est appelée traitement d'amélioration. La méthode d'objet proxy généré est la méthode cible + amélioration, le programmeur de transaction utilise uniquement l'opération CRUD, c'est-à-dire que la méthode cible et la méthode déclarée doivent s'exécuter dans la transaction.
Spring fournit de nombreuses implémentations de gestionnaire de transactions intégrées:
DataSourceTransactionManager: Situé dans le package org.springframework.jdbc.datasource, le gestionnaire de transactions de source de données fournit un seul Javax.sql.Datasource Management Management, pour la gestion des transactions de Spring JDBC Résumé Framework, Ibatis ou MyBatis Framework;
JDOTRANSACTIONMANGER: est situé dans le package org.springframework.orm.jdo, fournissant la gestion des transactions d'un seul javax.jdo.PersistenceManagerFactory, pour la gestion des transactions lors de l'intégration du framework JDO;
JpatransactionManager: est situé dans le package org.springframework.orm.jpa, fournissant une prise en charge d'une seule transaction javax.persistence.entityManagerFactory, et est utilisé pour gérer les transactions lors de l'intégration du cadre d'implémentation JPA;
HiberNateTransActionManager: est situé dans le package org.springframework.orm.Hibernate3, fournissant un support pour une seule transaction org.hibernate.SessionFactory, utilisée pour la gestion des transactions lors de l'intégration du cadre Hibernate; Ce gestionnaire de transactions ne prend en charge que la version HiberNate3 + et la version Spring3.0 + prend uniquement la version HiberNate 3.2+;
JtatransactionManager: est situé dans le package org.springframework.transaction.jta, fournissant une prise en charge de la gestion des transactions distribuées et de la déléguation de la gestion des transactions au Java EE Application Server Transaction Manager;
OC4JJtatransActionManager: Situé dans le package org.springframework.transaction.jta, Spring fournit un adaptateur à OC4J10.1.3 + Application Server Transaction Manager. Cet adaptateur est utilisé pour prendre en charge les transactions avancées fournies par le serveur d'applications;
WebSpheReUowTransactionManager: Situé dans le package org.springframework.transaction.jta, Spring fournit un adaptateur pour le gestionnaire de transaction du serveur d'applications WebSphere 6.0+. Cet adaptateur est utilisé pour prendre en charge les transactions avancées fournies par les serveurs d'application;
WeblogicjtatransactionManager: Situé dans le package org.springframework.transaction.jta, Spring fournit un adaptateur au gestionnaire de transaction du serveur d'applications applicables de WebLogic 8.1+. Cet adaptateur est utilisé pour prendre en charge les transactions avancées fournies par le serveur d'applications.
Spring fournit non seulement ces gestionnaires de transactions, mais fournit également des gestionnaires pour la gestion des transactions JMS, etc. Spring fournit une abstraction de transaction cohérente comme indiqué sur la figure.
printemps et hiberner
illustrer:
Spring fait quelques préparatifs avant d'appeler le gestionnaire de transactions spécifique, en définissant les politiques de lecture et d'écriture de la transaction, et ces politiques de transaction sont des choses publiques et sont écrites dans le fichier de configuration de Spring. Le traitement de ces contenus doit être placé dans une classe abstraite.
2. Traitement des transactions dans l'intégration du printemps et de l'hibernate
1.2 Introduction du fichier de configuration des propriétés dans le formulaire XML
<propriété name = "Locations"> <value> CLASSPATH: JDBC.Properties </value> </ Property>
Configurer la source de données DBCP
<bean id = "dataSource" destrement-méthod = "close"> <propriété name = "driverclassname" value = "$ {jdbc.DriverClassName}" /> <propriété name = "url" value = "$ {jdbc.url}" /> <propriété name = "username" value = "$ {jdbc.USERAM value = "$ {jdbc.password}" /> </ank>Introduire SessionFactory, utilisez le fichier de configuration externe Hibernate
<bean id = "SessionFactory2"> <propriété name = "configLocation"> <value> classpath: hibernate.cfg.xml </value> </ propriété> </ bean>
Injecter les couches DAO et de service
<bean id = "Persondao"> <propriété name = "SessionFactory"> <ref bean = "SessionFactory2" /> </ Property> </ Bean> <bean id = "PersonService"> <propriété name = "Persondao"> <refEb = "Persondao" /> </ Property> </ank>
Configurer le gestionnaire de transaction Hibernate
<bean id = "TransactionManager"> <propriété name = "SessionFactory"> <ref bean = "SessionFactory2" /> </ Property> </EAND>
Configurer les transactions déclaratives
effet:
1. Dites le gestionnaire de transactions de conteneur Spring
2. Dites à Spring Container quelle méthode utiliser quelle transaction
<tx: conseils transaction-manager = "transactionManager" id = "tx"> <tx: attributs> <! - Nom Scope de la méthode cible islation du niveau d'isolation propagation propagation propagation de propagation Attribut en lecture seule </ tx: conseils>
Configurer le point d'entrée
<aop: config> <aop: Pointcut expression = "Execution (* cn.qjc.hibernate.service.impl. *. * (..))" id = "perform" /> <span style = "white-space: pre"> </span> <! - Appliquer Pointcut à améliorer la méthode </aop: config>
classe d'implémentation DAO
* Méthode d'implémentation 1: Hériter hibernatedaosupport * @Author QJC * / public class PersondaoIMPl étend HiberNatedaosupport implémente Persondao {@Override public void SavePerson (personne personne) {this.GETHIBERNATETETÉ (). SAVE (personne); }}test
...
Avis:
1. Si une classe DAO hérite de HiberNatedAosupport, vous n'avez qu'à injecter SessionFactory dans le fichier de configuration Spring.
2. Si une classe DAO n'hérite pas d'hibernatedaosupport, elle doit avoir un attribut SessionFactory et l'injecter dans le fichier de configuration.
<bean id = "hibernatetemplate"> <propriété name = "sessionfactory" ref = "SessionFactory2"> </ propriété> </ank>
1.2 sous forme d'annotation
1. Appliquer le mécanisme de balayage automatique de Spring dans les fichiers de configuration
<Context: Component-Scan Base-Package = "CN.QJC" />
2. Introduire l'analyseur d'annotation dans le fichier de configuration
<tx: transaction-manager basée sur l'annotation = "TransactionManager" />
3. Annoter via @transaction au niveau de la couche de service
Remarque: S'il est annoté en tant que transaction en lecture seule au niveau de la classe, les paramètres de transaction de @transaction annotés dans les méthodes de cette classe auront priorité sur les paramètres de transaction du niveau de classe annoté.
1.3 Propriétés de propagation des transactions de printemps
Obligatoire: La méthode commerciale doit être exécutée dans une transaction. Si la méthode est déjà dans une transaction lors de son exécution, alors rejoignez-la à la transaction, sinon créez une nouvelle transaction pour vous-même (par défaut)
Non soutenu: Spring Container n'ouvre pas de transaction. Si la méthode est appelée dans une transaction, la transaction sera suspendue. Une fois la méthode terminée, la transaction sera restaurée.
ExigeNew: Qu'il existe ou non une transaction, la méthode commerciale créera toujours une nouvelle transaction.
Mandatorky: Une méthode commerciale ne peut être exécutée que dans une transaction existante. Si la méthode commerciale est appelée sans transaction, le conteneur lance une exception.
De plus, il existe des propriétés telles que les supports, jamais, imbriqués, etc., mais la valeur par défaut est généralement utilisée
propagation = "requis" Cette configuration peut résoudre le problème de nidification de la transaction. Qu'est-ce que les transactions nidiques?
Par exemple:
Il existe des transactions dans le cadre de workflow et une certaine méthode qui exploite la couche de service. La couche de service a également ses propres transactions. Lorsque le service est exécuté, la nidification des transactions se produira, c'est-à-dire que la méthode elle-même a des transactions et les méthodes de la méthode ont également des transactions. Il s'agit de nidification de transaction. Spring résout ce problème via la propagation d'attribut de propagation de transaction = "Obligatoire".
1.4 OpenInSessionView
Après l'intégration S2SH, Spring gère les transactions. Puisqu'il utilise la méthode de traitement des transactions déclaratives de Spring, la session est fermée immédiatement après l'appel.GETHIBERNATETÉTÉ (). S'il y a des transactions dans la méthode actuellement exécutée, la session est fermée lorsque la méthode de l'environnement de transaction est appelée. Une exception sera donc générée lorsque la valeur est sortie sur la page.
La méthode de traitement est: OpenSessionInView Mode (configuré dans web.xml)
<filter> <Filter-Name> HiberNateFilter </filter-name> <Filter-Class> org.springframework.orm.Hibernate3.Support.OpenSessionInViewFilter </ Filter-Class> <! - Singlesession est vrai par défaut. Si défini sur false, il est égal à aucune opensseInView -> <Init-Param> <Am param-name> singleSession </ param-name> <param-valeur> true </ param-name> HibernateFilter </filter> <url-Pattern> / Personservice </ Url-Patter>
D'après le code ci-dessus, nous pouvons voir que lors de la soumission d'une demande, la session a été activée dans l'OpenSessionInview, et la session doit être close après la réponse, ce qui signifie que l'OpenSessionInview doit être avant le filtre de Struts2. (Mettez la position du filtre Struts2 ci-dessus)
Cependant, il a également des inconvénients de permettre à OpenSessionInView: parce que l'arrêt de la session est retardé, et le cache de premier niveau d'Hibernate est dans la session, ce qui fera longtemps que les données en cache restent en mémoire.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.