准备工作
hibernate3
spring2
jotm2.1.9
2个oracle数据源
目标:在同一个service方法内,分别操作2个数据源的数据,任何一个发生错误,全部回滚
1、spring配置
1.1、jta《jotm》配置,所需jar包【spring.jar】
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
</bean>
<!-- 声明式事物,service方法必须声明@Transactional 才能使用jta的事物管理,否则就会独立开来,必须jar包【cglib.jar】-->
<tx:annotation-driven transaction-manager="txManager"
proxy-target-class="true" />
1.2、dataSource配置,所需jar包【xapool.jar, jotm-core.jar, carol.jar, carol-interceptor.jar】
<bean id="dataSourceA"
class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@192.168.3.122:1521:LXHORCL" />
</bean>
</property>
<property name="user" value="ADS" />
<property name="password" value="ADS" />
</bean>
<bean id="dataSourceB"
class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@192.168.7.13:1521:LWORCL" />
</bean>
</property>
<property name="user" value="ADS" />
<property name="password" value="ADS" />
</bean>
1.3、hibernate sessionFactory配置
<bean id="sessionFactoryA"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSourceA" />
</property>
<property name="mappingResources">
<list>
<value>META-INF/hbm-A.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</prop>
<prop key="hibernate.jdbc.bach_size">10</prop>
<prop key="hibernate.jdbc.use_query_cache">true</prop>
</props>
</property>
</bean>
<bean id="sessionFactoryB"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSourceB" />
</property>
<property name="mappingResources">
<list>
<value>META-INF/hbm-B.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider
</prop>
<prop key="hibernate.jdbc.bach_size">10</prop>
<prop key="hibernate.jdbc.use_query_cache">true</prop>
</props>
</property>
</bean>
好了,到这里基本上完成了基本的配置
1.5、具体的功能
<!-- BASE -->
<bean id="baseDaoA" class="com.hmf.alex.simple.dao.BaseDao">
<property name="sessionFactory">
<ref local="sessionFactoryA" />
</property>
</bean>
<bean id="baseDaoB" class="com.hmf.alex.simple.dao.BaseDao">
<property name="sessionFactory">
<ref local="sessionFactoryB" />
</property>
</bean>
<!-- FUNCTION -->
<bean id="userDaoA" parent="baseDaoA" lazy-init="true">
<property name="clazz">
<value>com.hmf.alex.simple.entities.User</value>
</property>
</bean>
<bean id="userDaoB" parent="baseDaoB" lazy-init="true">
<property name="clazz">
<value>com.hmf.alex.simple.entities.User</value>
</property>
</bean>
<bean id="userService"
class="com.hmf.alex.simple.service.UserService" lazy-init="true">
<property name="daoA">
<ref bean="userDaoA" />
</property>
<property name="daoB">
<ref bean="userDaoB" />
</property>
</bean>
2、测试
public class UserService {
private IDao daoA;
private IDao daoB;
.....
@Transactional
public void createAB(Object a ,Object b){
this.create(a, "A");
this.create(b, "B");
}
public Serializable create(Object o ,String type){
if("B".equals(type)){
return daoB.create(o);
}
return daoA.create(o);
}
}
推荐阅读
代码之余轻松一下:当前热门-人民的名义
JAVAEE容器如何管理EntityManager和PersistenceContext