- 6.1. トランザクション管理の中心となるインタフェース
- 6.2. トランザクション管理の準備
- 6.3. 宣言的トランザクション管理
6.2. トランザクション管理の準備
Spring では org.springframework.transaction.PlatformTransactionManager
インタフェースを実装する具象クラスとして JDBC, JDO, Hibernate, JTA それぞれに以下のクラスを用意しています。
org.springframework.jdbc.datasource.DataSourceTransactionManager
org.springframework.orm.jdo.JdoTransactionManager
org.springframework.orm.hibernate.HibernateTransactionManager
org.springframework.transaction.jta.JtaTransactionManager
JDBC を使用する場合には以下のように Bean 定義ファイルに設定します。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"><value>org.postgresql.Driver</value></property> <property name="url"><value>jdbc:postgresql://localhost:5432/Training</value></property> <property name="username"><value>postgres</value></property> <property name="password"><value></value></property> <property name="minIdle"><value>1</value></property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean>
org.springframework.jdbc.datasource.DataSourceTransactionManager
の dataSource プロパティに javax.sql.DataSource
を実装した任意の DataSource
を設定するだけです。JDBC を使用する場合には 1つ注意点があります。それは Connection を取得する際にはorg.springframework.jdbc.datasource.DataSourceUtils
クラスを使用しなければならないということです。以下のようにして Connection を取得します。
Connection conn = DataSourceUtils.getConnection(dataSource);
Spring がトランザクションを管理するために裏で Connection を管理しているので javax.sql.DataSource#getConnection()
メソッドを直接呼び出し、Connection を取得してはいけません。また、Connection#close() メソッドを呼び出してもいけません。
JTA を使用する場合は以下のようにします。DataSourceTransactionManager
とは異なり JtaTransactionManager
は DataSource やその他のリソースについて知っている必要はありません。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"><value>jdbc/webapp</value></property> </bean> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>