同じデータソースに対して 2 つのセッション ファクトリを定義する必要がある場合があります。セッション ファクトリの 1 つで、jdbc バッチ処理を構成しましたが、もう 1 つは構成しません。spring.xml は次のようになります。休止状態のバッチ処理が必要な場合もあれば、そうでない場合もあります。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
..datasource props here...
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="show_sql">${show_sql}</prop>
</props>
</property>
<property name="packagesToScan">
<list>
..packages here....
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<bean id="alwaysNewTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
<tx:annotation-driven/>
<bean id="sessionFactoryForBatching" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="show_sql">${show_sql}</prop>
<prop key="hibernate.jdbc.batch_size">${jdbc.batchSize}</prop>
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.order_updates">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
..same packages here..
</list>
</property>
</bean>
<bean id="transactionManagerForBatching" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryForBatching"/>
<qualifier value="txManagerBatch"/>
</bean>
<bean id="transactionTemplateForBatching" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManagerForBatching"/>
</bean>
<bean id="alwaysNewTransactionTemplateForBatching" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManagerForBatching"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
<qualifier value="txnTemplateWithBatching"/>
</bean>
コードでは、メソッドを次のようにマークしました
@Transactional("txManagerBatch")
public void method(){
// stuff happens here where we got to the database to get stuff
txnTemplate..execute(new TransactionCallback<Integer>() {
@Override
public Integer doInTransaction(TransactionStatus transactionStatus) {
//stuff here that happens in the inner transaction
}
});
//stuff happens here where we update the database
}
この構成では、メソッドの実行時にセッションが見つからないという例外が発生します..理由を知っている人はいますか? spring 3.1.1 と hibernate 4.0.1 を使用します