Hoyi 与数据库分区的读写 (hoyi入门系列文章五)
Hoyi 与数据库分区的读写 (hoyi入门系列文章五)
1.分区的配置
hoyi支持数据库的分区,举例子,我们以orders表为例子,当orders表订单越来越多 。我们需要将orders配置1.2在config 文件夹下建立 文件夹 jdbc-dist-orders,表示数据库以orders进行分区。同时增加jdbc-c1.properties,jdbc-c2.properties。如果有多个区则需要配置多个jdbc-cX.properties。
每个jdbc-cX.properties的文件的配置方式和jdbc.properties的配置一样,每个区也可以配置成单机或者集群方式。
2.集成分库前置工作
在hoyi er tool里新建orders实体。如图所示,注意uxid是为了分区使用,该字段的值为"分区-uuid",例如:c1-xxxx。
按照前面教程,使用hoyi er tool 生成sql语句并在两个不同的数据库里导入。 并生成对应实体orders.java。
3.分库的测试
在项目WebRoot下新建/demo4/controller/ClusterDemo.java,拷贝orders.java到/demo4/entity。
增加调度方法,作用是为了设置中间调度器的参数并把这些缓存到redis里。disctrictType.BALANCE_LOAD 的方式是该表数据数据最少就插入哪台。
public void LOADDEF() {
int ret = DistrictCtrls.Load_DEF_ENTS("orders", orders.class, disctrictType.BALANCE_LOAD);
this.HandlerEx("load success!~", ret);
}
//增加订单public void addOrder(){
IDatabase database = DistrictCtrls.get_Insert_DB("orders", orders.class);
orders _order = new orders(database.Get_Clust_UUID(), "1", "now", "note");
int result = _order.Insert(database);
this.HandlerEx("添加订单", result);
}
IDatabase database = DistrictCtrls.get_Insert_DB("orders", orders.class); 该方法会根据策略找到对应的写数据库。
先请求 http://localhost:8085/hoyidemo/demo4/controller/ClusterDemo.html?behavior=LOADDEF ,初始化调度器,
再调用http://localhost:8085/hoyidemo/demo4/controller/ClusterDemo.html?behavior=addOrder
可以看到数据库增加了一条订单,并且会根据订单的数据库的条数动态去插入不同数据库,做到均衡插入。
我们再增加一个查询订单的方法
//查找订单
public void findOrder(){
String uxid = this.getParams("uxid");
String cluster_key = DistrictCtrls.GetClustKey(uxid);
IDatabase databs = DataBaseCluster.Get_READ_SERVER("orders", cluster_key);
orders _orders = orders.E().Where(orders.uxid.Equals(uxid)).First(databs);
this.WriteUTF8JSONDATAMSG(1, "success", _orders);
}
http://localhost:8085/hoyidemo/demo4/controller/ClusterDemo.html?behavior=findOrder&uxid=c2_4a6cf0c3-533c-4be4-b8d5-7c62329219e9
IDatabase databs = DataBaseCluster.Get_READ_SERVER("orders", cluster_key);注意这个方法里的参数是根据配置文件jdbc-dist-orders 以及 jdbc-c1.properties的 orders 以及 c1 找到对应的数据库。
数据库的跨库尽量不做事务,联合查询则需要根据具体的业务逻辑进行接口拆分。