Spring多数据源实现

来源:http://itssh.cn/post/946.html

Spring 数据源默认只支持配置一个,如果需要配置多数据源,可在操作数据源之前动态改变数据源链接。

案例:

jdbc.properties:

#oracle
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username=用户名
jdbc.password=密码

#mysql
jdbc.driverClassName2=com.mysql.jdbc.Driver
jdbc.url2=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.username2=用户名
jdbc.password2=密码

Spring application.xml配置:




    
    
    
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        

        
        
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
      
          
              
                  
                  
              
        
         
        
    
    
    
        
    
    
    

动态获取数据源类 DynamicDataSource.java:

package cn.itssh.dataSource;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @ClassName: DynamicDataSource.java
 * @Description: 多数据源
 * @author: SM([email protected])
 * @date: 2017年6月7日 下午6:08:40
 */
public class DynamicDataSource extends AbstractRoutingDataSource  {

    /**
     * 多数据源
     */
    @Override
    protected Object determineCurrentLookupKey() {
        //
        return DataSourceContextHolder.getDataSource();
    }

    /**
     * 
     */
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

}

存放数据源线程类 DataSourceContextHolder.java

package cn.itssh.dataSource;
/**
 * @ClassName: DataSourceContextHolder.java
 * @Description: TODO
 * @author: SM([email protected])
 * @date: 2017年6月7日 下午6:10:20
 */
public class DataSourceContextHolder {

    //
    private static final ThreadLocal contextHolder = new ThreadLocal();
    /**
     * 
     * @param dataSource
     */
    public static void setDataSource(String dataSource) {  
        contextHolder.set(dataSource);  
    }  
  
    /**
     * @return
     */
    public static String getDataSource() {  
        return ((String) contextHolder.get());  
    }  
  
    /**
     */
    public static void clearDataSource() {  
        contextHolder.remove();  
    }  
}

查询数据接口 DataSourceDao.java

package cn.itssh.dao;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: DataSourceDao.java
 * @Description: TODO
 * @author: SM([email protected])
 * @date: 2017年6月14日 下午5:47:21
 */
public interface DataSourceDao {
    
    /**
     * 多数据源测试
     * @throws Exception
     */
    public List> queryList(int dataSource) throws Exception;
}

查询数据接口实现 DataSourceDaoImpl.java

package cn.itssh.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import cn.itssh.dataSource.DataSourceContextHolder;

/**
 * @ClassName: DataSourceDaoImpl.java
 * @Description: TODO
 * @author: SM([email protected])
 * @date: 2017年6月14日 下午5:49:04
 */
@Component
@Transactional
public class DataSourceDaoImpl extends SimpleJdbcDaoSupport implements DataSourceDao {

    /**
     * 多数据源
     */
    @Override
    public List> queryList(int dataSource) throws Exception {
        //
        List> list = new ArrayList>();
        //
        StringBuffer sb = new StringBuffer("select id,name from demo_table1");
        //
        ParameterizedRowMapper> map = null;
        //第二个数据源sql
        if(dataSource == 2){
            //清空内容
            sb.setLength(0);
            //
            sb.append("select id,name from student");
        }
        //
        //默认查询第一个数据源
        map = new ParameterizedRowMapper>(){
            //
            public Map mapRow(ResultSet rs, int arg1) throws SQLException {
                Map params = new HashMap();
                params.put("id", rs.getString("ID"));
                params.put("name", rs.getString("NAME"));
                //
                return params;
            }
        };
        
        //
        list = this.getSimpleJdbcTemplate().query(sb.toString(), map);
        //
        return list;
    }

}

测试方法:

/**
 * 测试数据源
*/
public static void testDataSource(){
    //设置数据源 1,2
    int ds = 1;
    //数据源
    DataSourceContextHolder.setDataSource("dataSource" + ds);
    //
    DataSourceDao dataSourceDao = (DataSourceDao)ServiceHelper.getBean("dataSourceDaoImpl");
    try {
    //
    List> list = dataSourceDao.queryList(ds);
    //
    System.out.println("总记录数:"+list.size() + "条,查询到的数据为:");
    //
    System.out.println(list);
    } catch (Exception e) {
        System.out.println("查询失败...." + e.getMessage());
    }finally{
        //清空线程
        DataSourceContextHolder.clearDataSource();
    }
}

来源:http://itssh.cn/post/946.html

你可能感兴趣的:(Spring多数据源实现)