标签:conf div rds public tar math val 返回 value
1. 机器1是主机,机器4是备机
application-context.xml
<bean class="com.caland.sun.client.datasources.DataSourceDescriptor">
<property name="identity" value="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; }
标签:conf div rds public tar math val 返回 value
原文地址:http://www.cnblogs.com/an5211/p/7008067.html