`

srping , AbstractRoutingDataSource 主从数据库切换

 
阅读更多

AbstractRoutingDataSource

spring 中,一个很好用但是容易被忽略的,就是AbstractRoutingDataSource,它的一个作用就是可以根据用户发起的不同请求去转换不同的数据源,比如根据用户的不同地区语言选择不同的数据库,下面举例说明:

    import org.springframework.context.i18n.LocaleContextHolder;  
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
       
    public class MyRoutingDataSource extends AbstractRoutingDataSource{  
        @Override  
        protected Object determineCurrentLookupKey() {  
            String language = LocaleContextHolder.getLocale().getLanguage();  
            System.out.println("Language obtained: "+ language);  
            return language;  
        }  

 首先在这里,继承了AbstractRoutingDataSource类,然后获得当前的语言种类,在接下来中要用到:
  然后设置两个数据源,如下:

    jdbc.databaseurlOne=jdbc:mysql://127.0.0.1:3306/test  
    jdbc.databaseurlTwo=jdbc:mysql://127.0.0.1:3306/testTwo  

  然后同样在配置文件中设置:

<bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource"  
    destroy-method="close"  
    p:driverClassName="${jdbc.driverClassName}"  
    p:username="${jdbc.username}"  
    p:password="${jdbc.password}" />  
   
<bean id="concreteDataSourceOne"  
    parent="abstractDataSource"  
    p:url="${jdbc.databaseurlOne}"/>  
    
 <bean id="concreteDataSourceTwo"  
    parent="abstractDataSource"  
    p:url="${jdbc.databaseurlTwo}"/> 

 可以看到,这里有两个不同的数据库,这里假设各自的用户名和密码都是一样的,只是URL不同,

    <bean id="dataSource" class="com.howtodoinjava.controller.MyRoutingDataSource">  
       <property name="targetDataSources">  
          <map key-type="java.lang.String">  
             <entry key="en" value-ref="concreteDataSourceOne"/>  
             <entry key="es" value-ref="concreteDataSourceTwo"/>  
          </map>  
       </property>  
       
    </bean>  

 这里,就是用到了上面的MyRoutingDataSource类,其中指定当返回的语言是en的时候,用
  concreteDataSourceOne数据源,为es的时候,用concreteDataSourceTwo

这个类就是用来做主从数据库的,再做两个annotation,比如master和slave 写在方法上,配合这个类就可以做数据库主库从库读写分离了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics