场景:在Spring+Mybatis搭建的项目中要配置两个数据库,如何实现?

    其实也不是多难的事情,只要把配置配好了,一切问题就迎刃而解了,废话不多说,且看

如下配置……


配置一:jdbc.properties

配置两个数据库:myuser和myitem

myuser.jdbc.driver=com.mysql.jdbc.Driver
myuser.jdbc.url=jdbc:mysql://192.168.1.100:3306/myuser?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myuser.jdbc.username=root
myuser.jdbc.password=123456

myitem.jdbc.driver=com.mysql.jdbc.Driver
myitem.jdbc.url=jdbc:mysql://192.168.1.100:3306/myitem?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
myitem.jdbc.username=root
myitem.jdbc.password=123456

配置二:applicationContext.xml

配置:

    两个数据源(myUserDataSource和myItemDataSource)、

    一个动态的DataSource(dynamicDataSource);

   

      
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
    
    
    
        
            
                
                
            
        
        
           
     

有童鞋可能会问:DynamicDataSource这个类是怎么回事?

别急,这个类是自定义的一个类,此类必须继承:AbstractRoutingDataSource这个抽象类,并且重写

AbstractRoutingDataSource方法,动态数据源才会生效。

代码如下:

/**
 * 自定义动态数据源,继承AbstractRoutingDataSource抽象类,
 * 重写determineCurrentLookupKey方法
 * @author root
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }
}

问:DataSourceContextHolder这个类是什么干嘛的?

代码如下:

/**
*设置数据库类型,指定使用哪个数据库
*@author root
*/
public class DataSourceContextHolder {
    
    private static final ThreadLocal contextHolder = new ThreadLocal();
    //默认数据源(userDataSource)
    public static final String userDataSource = "userDataSource";
    
    //另外一个数据源(和配置文件中的key对应)
        public static final String itemDataSource = "itemDataSource";

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

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

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

问:那事物怎么管理呢?别急,继续往下看……

配置三:applicationContext-transaction.xml


    
        
    

    
    
        
            
            
            
            
        
    

    
        
        
        
        
    

问:那么sqlSessionFactory怎么获取数据源呢?继续配置……

配置四:applicationContext-mybatis.xml

  
    
        
        
        
        
        
        

          
          
          
    

到这里,其实该配置的都已经配置完了。

问:那么在代码中该如何使用呢?比如说要插入的数据时该往哪个数据库中插入呢?我怎么保证数据就是我要插入的数据库呢?

就是在代码中手动切换下,在事物开启之前先手动设置指定下数据库,然后进行逻辑,如果是要对配置的默认数据库进行操作的话就不用切数据库了,如果是对另外一个数据库操作的话就要在Controller中手动切换数据库:

//手动切换数据库
DataSourceContextHolder.setDbType(DataSourceContextHolder.itemDataSource);

// 需要执行的逻辑代码……对数据库的增删改

//这里要手动清理刚开启的事物,不然后面的操作可能会出现错误。
DataSourceContextHolder.clearDbType();

这样就欧了。