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模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章