根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。
用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表
在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号
与MyCat的类似分片算法对比
中间件
DBLE
MyCat
分片算法种类 enum 分区算法 分片枚举
两种中间件的枚举分片算法使用上无差别。
开发注意点
【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)
【分片索引】2. 枚举值之间不能重复
Male=0Male=1或者
123=1123=2会导致分片策略加载出错
【分片索引】3. 不同枚举值可以映射到同一个分片上
Mr=0Mrs=1Miss=1Ms=1123=0运维注意点
【扩容】1. 增加枚举值无需数据再平衡
【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移
【缩容】1. 减少枚举值需要数据再平衡
【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 <property name="defaultNode">、<property name="mapFile">和 <property name="type">
【配置项】2. 在 rule.xml 中配置 <property name="defaultNode"> 标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片
【配置项】3. 在 rule.xml 中配置 <property name="mapFile"> 标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。
【配置项】4. 编辑 mapFile 所配置的文件
记录格式为:<枚举值>=<分片编号>
枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行
【配置项】5. 在 rule.xml 中配置 <property name="type"> 标签;type 必须为整型;取值为 0 时,mapFile 的<枚举值>必须为整型;取值为非 0 时,mapFile 的<枚举值>可以是任意字符(除了=和换行符)
1.关于 Java Enum
Enum 一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较时候可以用 ”==” 来替换 equals 。是一种好的习惯。 JDK1.5 之前没有 Enum 这个类型,那时候一般用接口常量来替代。有了 JavaEnum 之后,可以更贴近的表示这种常量。
2. 如何使用 Java Enum
简单的用法: JavaEnum 简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:
//性别public enum SexEnum {
male , female
}
//颜色
public enum Color {
RED , BLUE,GREEN,BLACK
}
枚举对象里面的值都必须是唯一的。
可以通过 Enum 类型名直接引用该常量,如 SexEnum.male,Color.RED.
复杂用法: Java 为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象,看个下面的例子:
WeekDay.java
/*** @author admin
* 2015-12-03
* 定义一个枚举类型,代表星期一到星期日的7个缩写常量
* 同时还定义了枚举类型的属性day,该属性可以是final,也可是变量
* 同时还定义了该枚举类型的一个方法printDay
*/
public enum WeekDay {
Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri(
"Friday"), Sat("Saturday"), Sun("Sunday")
/**定义枚举类型自己的属性**/
private final String day
private WeekDay(String day) {
this.day = day
}
/**定义枚举类型自己的方法**/
public static void printDay(int i){
switch(i){
case 1: System.out.println(WeekDay.Mon) break
case 2: System.out.println(WeekDay.Tue)break
case 3: System.out.println(WeekDay.Wed)break
case 4: System.out.println(WeekDay.Thu)break
case 5: System.out.println(WeekDay.Fri)break
case 6: System.out.println(WeekDay.Sat)break
case 7: System.out.println(WeekDay.Sun)break
default:System.out.println("wrong number!")
}
}
public String getDay() {
return day
}
}
WeekDayTest.java
/*** @author admin
* 2015-12-03
* 测试枚举类型WeekDay.
*/
public class WeekDayTest {
public static void main(String args[]) {
for (WeekDay day : WeekDay.values()) {
System.out.println(day + "====>" + day.getDay())
}
WeekDay.printDay(5)
}
}
输出结果为:
Mon====>Monday
Tue====>Tuesday
Wed====>Wednesday
Thu====>Thursday
Fri====>Friday
Sat====>Saturday
Sun====>Sunday
Fri
楼上的。。mysql里有这种类型,是一种字符串类数据列类型ENUM('value1','value2',...) 65535个成员 1或2字节
但是用的比较少。。。
你得写程序自己处理下,大概是下边这样
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.Statement
public class EnumTesting {
Connection connection
Statement statement
public EnumTesting() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance()
connection = DriverManager
.getConnection("jdbc:mysql://192.168.1.25/test?user=spider&password=spider")
} catch (Exception e) {
System.err.println("Unable to find and load driver")
System.exit(1)
}
}
public void doWork() {
try {
statement = connection.createStatement()
ResultSet rs = statement
.executeQuery("SHOW COLUMNS FROM enumtest LIKE 'status'")
rs.next()
String enums = rs.getString("Type")
System.out.println(enums)
int position = 0, count = 0
String[] availableEnums = new String[10]
while ((position = enums.indexOf("'", position)) >0) {
int secondPosition = enums.indexOf("'", position + 1)
availableEnums[count++] = enums.substring(position + 1,
secondPosition)
position = secondPosition + 1
System.out.println(availableEnums[count - 1])
}
rs.close()
statement.close()
connection.close()
} catch (Exception e) {
e.printStackTrace()
}
}
public static void main(String[] args) {
Enum e = new Enum()
e.doWork()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)