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; }
时间: 2024-10-04 16:51:37