首页 > 代码库 > 多库数据源配置

多库数据源配置

1. 机器1是主机,机器4是备机

application-context.xml
<bean class="com.caland.sun.client.datasources.DataSourceDescriptor">
  <property name="identity" value="http://www.mamicode.com/partition1"/>                  // 
  <property name="targetDataSource" ref="dataSource1"/> // 1. 指定要访问的数据源
  <property name="targetDetectorDataSource" ref="dataSource1"/> // 2. 指定访问的数据源是否正常运转 心跳检查
  <property name="standbyDataSource" ref="dataSource4"/> // 3. 同组备机的数据源
  <property name="standbyDetectorDataSource" ref="dataSource4"/> // 4. 心跳检查同组备机是否正常运转的
</bean>

2. 路由规则

application-context.xml
配置路由规则
<bean id="hashFunction" class="com.caland.core.dao.router.HashFunction"/>
<bean id="internalRouter" class="com.caland.sun.client.router.config.InternalRouterXmlFactoryBean">
  <property name="functionsMap">
    <Map>
      <entry key="hash" value-ref="hashFunction"></entry>
    <Map>
  </property>
  <property name="configLocations">
    <list>
      <value>classpath:/dbRule/sharding-rules-on-namespace.xml</value>
    </list>
  </property>
</bean>


sharding-rules-on-namespace.xml
<rule>
  <namespace>User</namespace>
  <!--表达式如果不使用自定义路由规则函数,而是直接使用taobaoId%2==0 这种的话就不用在文件中配置<property name="functionsMap">中了 -->
  <shardingExpression>hash.applyUser(username)==1</shardingExpression> //Hash算法,用户名,如果等于1 --->datasource中 partition1
  <shards>partition1</shards>
</rule>

3. 

  
HashFunction
/*
* * 对三个数据库进行散列分布 * 1. 返回其他值,没有在配置文件中配置的,如负数等,在默认数据库中查找 * 2. 比如现在配置文件中配置有三个结果进行散列,如果返回0,那么apply方法只调用一次,如果返回为2 * 那么apply方法就会调用三次,也就是每次是按照配置文件中的顺序依稀调用方法进行判断结果,而不会缓存方法返回只进行判断 * @param username * @return */ public int applyUser(String username){ // 先从缓存中获取 没有则查询数据 // input 可能是id,拿id到缓存里去查用户的DB坐标信息,然后把 int result = Math.abs(username.hashCode()%1024);// 0-1023 System.out.println("hash:"+result); if(0<=result&&result<256){ result=1; System.out.println("在第一个数据库中"); } if(256<=result&&result<512){ result = 2; System.out.println("在第二个数据库中"); } if(512<=result&&result<1024){ result=3; System.out.println("在第三个数据库中"); } return result; }

 

  

多库数据源配置