这里用的是比较原始的办法。笨办法。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
default-autowire="byName">
<!-- ==================== ======================== =====================-->
<bean id="dataSourceAcc" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/accor"></property>
</bean>
<bean id="sqlMapClientAcc" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:config/SqlMapConfig.xml">
</property>
<property name="dataSource" ref="dataSourceAcc"></property>
</bean>
<bean id="transactionManagerAcc" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" scope="prototype">
<property name="dataSource"><ref local="dataSourceAcc"/></property>
</bean>
<!-- ==================== ======================== =====================-->
<bean id="dataSourceUatAcc" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/uatacc"></property>
</bean>
<bean id="sqlMapClientUatAcc" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:config/SqlMapConfig.xml">
</property>
<property name="dataSource" ref="dataSourceUatAcc"></property>
</bean>
<bean id="transactionManagerUatAcc" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" scope="prototype">
<property name="dataSource"><ref local="dataSourceUatAcc"/></property>
</bean>
<!-- ==================== ======================== =====================-->
<bean class="dao.impl.TestUserDAOImpl" id="testUserDAO" scope="prototype">
<property name="sqlMapClient" ref="sqlMapClientAcc"></property>
<property name="sqlMapClientAcc" ref="sqlMapClientAcc"></property>
<property name="sqlMapClientUatAcc" ref="sqlMapClientUatAcc"></property>
</bean>
<bean id="multyDataSourceTestService" class="service.impl.MultyDataSourceTestServiceImpl" scope="prototype">
<property name="testUserDAO" ref="testUserDAO"></property>
<property name="transactionManagerAcc" ref="transactionManagerAcc"></property>
<property name="transactionManagerUatAcc" ref="transactionManagerUatAcc"></property>
</bean>
<bean id="multyDataSourceTestAction" class="action.MultyDataSourceTestAction" scope="prototype">
<property name="multyDataSourceTestService" ref="multyDataSourceTestService"></property>
</bean>
</beans>
这里三处要配置成双份的:DataSource/SqlMapClient/TransactionManager
SQLMAP文件我只用了一份,公用
这里的sqlMapClient一定要设置,或者default-autowire="byName",我这里是重复了,重复没关系
package service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import model.TestUser;
import dao.TestUserDAO;
import service.MultyDataSourceTestService;
public class MultyDataSourceTestServiceImpl implements MultyDataSourceTestService{
private TestUserDAO testUserDAO;
private DataSourceTransactionManager transactionManagerAcc;
private DataSourceTransactionManager transactionManagerUatAcc;
public void setTransactionManagerAcc(
DataSourceTransactionManager transactionManagerAcc) {
this.transactionManagerAcc = transactionManagerAcc;
}
public void setTransactionManagerUatAcc(
DataSourceTransactionManager transactionManagerUatAcc) {
this.transactionManagerUatAcc = transactionManagerUatAcc;
}
public void setTestUserDAO(TestUserDAO testUserDAO) {
this.testUserDAO = testUserDAO;
}
public List<TestUser> findUsers(Integer id) throws Exception {
List<TestUser> users = new ArrayList<TestUser>();
users = testUserDAO.selectAccUsers(id);
System.out.println(users);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManagerUatAcc.getTransaction(def);
TransactionStatus status2 = transactionManagerAcc.getTransaction(def);
try{
System.out.println(testUserDAO.updateAccUsers());
if(true)
throw new RuntimeException();
System.out.println(testUserDAO.updateAccUsers2());
transactionManagerUatAcc.commit(status);
}catch (Exception e) {
e.printStackTrace();
transactionManagerUatAcc.rollback(status);
}
return users;
}
}
这里TransactionStatus和DefaultTransactionDefinition用来开启事务,如果是SELECT可以直接DAO,需要使用事务的时候才有必要用到这些。
这个比起在SPRING配置文件里面配置事务各有优缺点,适合用于嵌套事务。
package dao.impl;
import java.util.List;
import model.TestUser;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.client.SqlMapClient;
import dao.TestUserDAO;
public class TestUserDAOImpl extends SqlMapClientDaoSupport implements TestUserDAO{
private SqlMapClient sqlMapClientAcc;
private SqlMapClient sqlMapClientUatAcc;
public void setSqlMapClientAcc(SqlMapClient sqlMapClientAcc) {
this.sqlMapClientAcc = sqlMapClientAcc;
}
public void setSqlMapClientUatAcc(SqlMapClient sqlMapClientUatAcc) {
this.sqlMapClientUatAcc = sqlMapClientUatAcc;
}
@SuppressWarnings("unchecked")
public List<TestUser> selectAccUsers(Integer id) throws Exception {
super.setSqlMapClient(sqlMapClientAcc);
return (List<TestUser>)getSqlMapClientTemplate().queryForList("selectUsers");
}
@SuppressWarnings("unchecked")
public List<TestUser> selectUatAccUsers(Integer id) throws Exception {
super.setSqlMapClient(sqlMapClientUatAcc);
return (List<TestUser>)getSqlMapClientTemplate().queryForList("selectUsers");
}
public Integer updateAccUsers() throws Exception {
super.setSqlMapClient(sqlMapClientAcc);
return getSqlMapClientTemplate().update("updateUsers");
}
public Integer updateUatAccUsers() throws Exception {
super.setSqlMapClient(sqlMapClientUatAcc);
return getSqlMapClientTemplate().update("updateUsers");
}
public Integer updateAccUsers2() throws Exception {
super.setSqlMapClient(sqlMapClientAcc);
return getSqlMapClientTemplate().update("updateUsers2");
}
public Integer updateUatAccUsers2() throws Exception {
super.setSqlMapClient(sqlMapClientUatAcc);
return getSqlMapClientTemplate().update("updateUsers2");
}
}
这里定义了两个sqlMapClient,由spring配置文件实例化,super.setSqlMapClient设置template模板