Spring动态创建,加载,使用多数据源

问题

       最近公司项目中遇到了一个问题,那就是Spring整合MyBatis需要动态切换数据源来访问不同的数据库,因为是游戏的后台,而公司的数据库都部署在不同的机器上,所以需要配置不同的数据源来达到访问数据的目的。一般的思路就是使用Spring配置数据源,然后动态的切换达到访问不同的数据库。

解决方法

       自定义一个类继承自Spring的抽象类AbstractRoutingDataSource,然后实现其方法determineCurrentLookupKey()方法就可以了。上代码:
DynamicDataSource.java

package com.think.dao;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * 动态切换数据库
 * Created by veion on 2016/10/23.
 */
public class DynamicDataSource extends AbstractRoutingDataSource{
    private static DynamicDataSource instance;
    private static byte[] lock=new byte[0];
    private static Map dataSourceMap=new HashMap();

    @Override
    public void setTargetDataSources(Map targetDataSources) {
        super.setTargetDataSources(targetDataSources);
        dataSourceMap.putAll(targetDataSources);
        //重要的方法,一定要加上不然会出现动态添加数据源的时候无法生效的情况
        super.afterPropertiesSet();
    }

    public Map getDataSourceMap() {
        return dataSourceMap;
    }

    public static synchronized DynamicDataSource getInstance(){
        if(instance==null){
            synchronized (lock){
                if(instance==null){
                    instance=new DynamicDataSource();
                }
            }
        }
        return instance;
    }
    //必须实现其方法
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDBType();
    }
}

DataSourceContextHolder.java

package com.think.dao;

/**
 * 数据库切换类
 * Created by veion on 2016/10/23.
 */
public class DataSourceContextHolder {
    private static final ThreadLocal contextHolder = new ThreadLocal();

    public static synchronized void setDBType(String dbType){
        contextHolder.set(dbType);
    }

    public static String getDBType(){
        return contextHolder.get();
    }

    public static void clearDBType(){
        contextHolder.remove();
    }
}

通过上面的方法之后,我们就可以在自己的项目中不管是动态创建数据源还是静态配置数据源都没有问题了。上一段我的数据源配置。
spring-config-dao.xml




    
    
        
    

    
    

    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
        
    

    
        
    

    
    
        
            
                
                
                
            
        
        
    

    
        
        
        
        
    

    
        
        
    

    
        
    

    
    
        
    

    
        
            
            
            
            
        
    

    
        
        
        
    

动态创建数据源添加到动态数据源中去。

        Map dataSourceMap = new HashMap();
        Map dbsMap = new HashMap();
        for (int i = 0; i < serverConfigModelList.size(); i++) {
            ServerConfigModel model = serverConfigModelList.get(i);
            if (serverIdList.contains(model.getServer_id())) {
                continue;
            } else {
                serverIdList.add(model.getServer_id());
            }
            String localurl = "jdbc:mysql://" + model.getRemote_host() + ":"+ model.getData_port() + "/" +model.getDb_name()+ "?useUnicode=true&characterEncoding=UTF-8";
            DynamicDataSourcePool dataSourcePool = new DynamicDataSourcePool(
                    model.getDataSourceName(), model.getDataSourcePassWord(),
                    localurl, "com.mysql.jdbc.Driver");

            if (dataSourcePool != null && dataSourcePool.getPool() != null) {
                /*
                 * dataSourcePool.getConnection(); factory.bind("" +
                 * model.getServer_id(), dataSourcePool);
                 */
                dataSourceMap.put(String.valueOf("game-" + model.getServer_id()),dataSourcePool.getPool());
                dbsMap.put(String.valueOf("game-" + model.getServer_id()),String.valueOf("game-" + model.getServer_id()));
            }
        }
        DBType.putDbMap(dbsMap);
        DynamicDataSource.getInstance().setTargetDataSources(dataSourceMap);

The end.

你可能感兴趣的:(Spring动态创建,加载,使用多数据源)