SPRING IBATIS 多数据源

这里用的是比较原始的办法。笨办法。

<?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模板

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值