1。スプリング宣言トランザクション
1.1 Springのトランザクションマネージャー
Springはトランザクションを直接管理するものではありませんが、JTAまたは対応する持続性メカニズムが提供する特定のプラットフォームのトランザクション実装へのトランザクションを管理する責任を委任します。スプリングコンテナは物事の操作に責任があり、スプリングコンテナは顔として機能し、トランザクション方法は拡張処理と呼ばれます。生成されたプロキシオブジェクトメソッドは、ターゲットメソッド +エンハンスメントです。つまり、トランザクションプログラマーはCRUD操作のみを使用します。つまり、ターゲットメソッドと宣言されたメソッドはトランザクションで実行する必要があります。
Springは、多くの組み込みのトランザクションマネージャーの実装を提供します。
DataSourcetransactionManager: org.springframework.jdbc.datasourceパッケージにあり、データソーストランザクションマネージャーは、Spring JDBC抽象フレームワーク、IbatisまたはMybatisフレームワークのトランザクション管理のために、単一のjavax.sql.datasourceトランザクション管理を提供します。
jdotransactionmanager: org.springframework.orm.jdoパッケージにあり、JDOフレームワークを統合する際のトランザクション管理のための単一のjavax.jdo.jdo.persistencemanagerfactoryのトランザクション管理を提供します。
jpatransactionManager: org.springframework.orm.jpaパッケージにあり、単一のjavax.persistence.entitymanageractoryトランザクションのサポートを提供し、JPA実装フレームワークを統合する際のトランザクションの管理に使用されます。
hibernatetransactionManager: org.springframework.orm.hibernate3パッケージにあり、単一のorg.hibernate.sessionFactoryトランザクションのサポートを提供します。このトランザクションマネージャーは、hibernate3+バージョンのみをサポートしており、Spring3.0+バージョンはHibernate 3.2+バージョンのみをサポートしています。
jtatransactionmanager: org.springframework.transaction.jtaパッケージにあり、分散トランザクション管理のサポートを提供し、Java EEアプリケーションサーバートランザクションマネージャーにトランザクション管理を委任します。
oc4jtatransactionmanager: org.springframework.transaction.jtaパッケージにあるSpringは、OC4J10.1.3+ Application Server Transaction Managerのアダプターを提供します。このアダプターは、アプリケーションサーバーが提供する高度なトランザクションをサポートするために使用されます。
WebSphereUowTransactionManager: org.springframework.transaction.jtaパッケージにあり、SpringはWebSphere 6.0+アプリケーションサーバートランザクションマネージャーのアダプターを提供します。このアダプターは、アプリケーションサーバーが提供する高度なトランザクションをサポートするために使用されます。
weblogicjtatransactionmanager: org.springframework.transaction.jtaパッケージにあるSpringは、Weblogic 8.1+ Application Server Transaction Managerにアダプターを提供します。このアダプターは、アプリケーションサーバーが提供する高度なトランザクションをサポートするために使用されます。
Springは、これらのトランザクションマネージャーを提供するだけでなく、JMSトランザクション管理などのマネージャーを提供します。Springは、図に示すように一貫したトランザクション抽象化を提供します。
春と冬眠
説明:
Springは、特定のトランザクションマネージャーに電話をかけ、トランザクションの読み取りおよび書き込みポリシーを事前に設定する前にいくつかの準備を行います。これらのトランザクションポリシーは公開されており、Spring構成ファイルに記載されています。これらの内容の処理は、抽象クラスに配置する必要があります。
2。スプリングと冬眠の統合におけるトランザクション処理
1.2 XMLフォームでのプロパティ構成ファイルの導入
<プロパティ名= "locations"> <value> classpath:jdbc.properties </value> </property>
DBCPデータソースを構成します
<bean id = "dataSource" Destroy-method = "close"> <プロパティ名= "driverclassname" value = "$ {jdbc.driverclassname}" /> <プロパティ名= "url" value = "$ {jdbc.url}" />> <プロパティname = "username" value = "$ {jdbc.password}" /> < /bean>SessionFactoryを紹介し、Hibernate外部構成ファイルを使用します
<bean id = "sessionfactory2"> <プロパティ名= "configlocation"> <value> classpath:hibernate.cfg.xml </value> </property> </bean>
DAOとサービスレイヤーを注入します
<bean id = "persondao"> <Property name = "sessionfactory"> <ref bean = "sessionfactory2"/> </property> </bean> <bean id = "personservice"> <property name = "persondao"> <ref bean = "pershdao"/>> </bean> </bean> </bean>
Hibernate Transaction Managerを構成します
<bean id = "TransactionManager"> <Property name = "SessionFactory"> <ref bean = "sessionfactory2"/> </property> </bean>
宣言的なトランザクションを構成します
効果:
1.スプリングコンテナトランザクションマネージャーに伝えます
2.スプリングコンテナに、どのトランザクションを使用するかを伝える
<TX:Advice Transaction-Manager = "TransactionManager" ID = "TX"> <TX:属性> <! - ターゲットメソッドの名前範囲像隔離レベルの伝播伝播伝播属性読み取りのみの真の読み取り専用トランザクションfalse read-writeトランザクション - > <tx:method name = "save =" "defollagation =" </tx:属性> </tx:アドバイス>
エントリポイントを構成します
<aop:config> <aop:pointcut expression = "execution(*cn.qjc.hibernate.service.impl。*(..*(..))" id = "forped"/> <span style = "white-face:pre"> </span> <! - ポイントカットを拡張方法に適用する - > <aop
DAO実装クラス
*実装方法1:HibernatedAosupport * @Author QJC */ Public Class PersonDaoimpl extend hibernatedaoSupport Persondao {@Override public void saveserson(person person){this.gethernateTemplate()。 }}テスト
...
知らせ:
1. DAOクラスがHibernatedAoSupportを継承する場合、StingFactoryをSpring構成ファイルに挿入するだけです。
2. DAOクラスがHibernatedAoSupportを継承しない場合、SessionFactory属性を持ち、構成ファイルに挿入する必要があります。
<bean id = "hibernateTemplate"> <プロパティ名= "sessionfactory" ref = "sessionfactory2"> </property> </bean>
1.2注釈の形式
1.構成ファイルにSpringの自動スキャンメカニズムを適用します
<コンテキスト:Component-Scanベースパッケージ= "cn.qjc"/>
2.構成ファイルに注釈パーサーを紹介します
<TX:Annotation-driven Transaction-Manager = "TransactionManager"/>
3.サービスレイヤーで@Transactionを介して注釈を付けます
注:クラスレベルで読み取り専用のトランザクションとして注釈が付けられた場合、このクラスのメソッドで注釈付けされた@transactionのトランザクション設定は、注釈付きのクラスレベルのトランザクション設定よりも優先されます。
1.3スプリングトランザクションの伝播特性
必須:ビジネス方法は、トランザクションで実行する必要があります。メソッドが実行中にトランザクションが既にある場合は、トランザクションに参加し、それ以外の場合は自分の新しいトランザクションを作成します(デフォルト)
サポートされていない:スプリングコンテナはトランザクションを開きません。メソッドがトランザクションで呼び出された場合、トランザクションは停止されます。メソッドが終了すると、トランザクションが復元されます。
必要:トランザクションが存在するかどうかにかかわらず、ビジネス方法は常に新しいトランザクションを作成します。
Mandatorky:ビジネス方法は、既存のトランザクションでのみ実行できます。ビジネス方法がトランザクションなしで呼び出される場合、コンテナは例外をスローします。
さらに、サポート、ネット、ネストなどのプロパティがありますが、通常はデフォルトが使用されます
propagation = "必須"この構成は、トランザクションネスティングの問題を解決できます。トランザクションネスティングとは何ですか?
例えば:
ワークフローフレームワークにはトランザクションがあり、サービスレイヤーを操作する特定の方法があります。サービスレイヤーには独自のトランザクションもあります。サービスが実行されると、トランザクションネストが発生します。つまり、メソッド自体にトランザクションがあり、メソッドのメソッドにもトランザクションがあります。これはトランザクションネストです。 Springは、トランザクション伝播属性伝播=「必須」を通じてこの問題を解決します。
1.4 OpenInsessionView
S2SH統合の後、Springはトランザクションを管理します。 Springの宣言的トランザクション処理方法を使用するため、セッションはthis.gethibernateTemplate()メソッドを呼び出した直後に閉鎖されます。現在実行されているメソッドにトランザクションがある場合、トランザクション環境の方法が呼び出されたときにセッションは閉じられます。そのため、値がページに出力されると、例外が生成されます。
処理方法は次のとおりです。OpenSessionInviewモード(web.xmlで構成)
<filter> <filter-name> hibernatefilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessioninviewfilter </filter-class> <! - シングルはデフォルトで真です。 falseに設定されている場合、それはopensessioninviewに等しくなります - > <init-param> <param-name> singlesession </param-name> <param-value> true </param-value> </init-param> </filter> <filter-name> hibernatefilter </filter-name> <url-perthice </url-perthice>
上記のコードから、リクエストを送信する際にセッションがOpenSessionInviewでオンになっていることがわかり、セッションは応答後に閉じる必要があります。 (Struts2フィルターの位置を上に置く)
ただし、OpenSessionInviewを有効にするための欠点もあります。セッションのシャットダウンが遅れ、冬眠の第1レベルのキャッシュがセッションにあるため、大量のキャッシュデータが長期にわたってメモリに留まります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。