问个分库分表的问题

@詹总,你好。

    现在想分库分表,问个现在的一些问题。

    1.我看现在代码中有DbKit.addConfig() 和 DbKit.remove(config) ,我可以根据用户传过来的参数1 , 判断是否创建了数据库database_1 ,如果创建了,那么直接use下这个数据源。如果没有创建,那么addConfig。 这种思路是否可以呢?

    2.这种情况下ActiveRecord的arp.addMapping() 怎么处理呢, 因为我已经分表了,数据库表可能随时会有user_1, user_2,user_3这种。

    3.有没有其他的建议,感觉以后在数据库比较大的情况下,这种分库分表会出现很多。现在是否有好的资料参考?

评论区

IvyHelen

2016-08-12 13:58

JFinal

2016-08-12 14:23

简单来说我是建议在性能压力大的时候采用数据库集群,使用读写分离的方式提升效率,分库分表相对来说比较麻烦。读写分离是对开发者透明的,可以使用中间件或者配置 mysql 的方式自动化实现读写分离。

回到你这的问题:
1:这种思路是可以的,但关键在于对开发者来说要是透明的,不需要开发者去处理不同数据库之间的差异,例如,你可以通过扩展 MyDbPro extends DbPro,将 MyDbPro 注入到 Db 中替换原来的DbPro 对象,在这个 MyDbPro 中使用一个 threadlocal 来自动化去判断数据库是哪个,然后自动化 use(...) 到不同的数据库上去。对于 Model 来说,你可以通过实现一个 MyBaseModel 继承原来的 BaseModel 实现数据源自动切换。或者是针对不同的数据源映射到不同的 Model 上去最好。

2:建议就是我刚刚讲的,一是尽可能使用读写分离集群方式。二是可以将大系统拆分成小型服务,让这些个小型服务都使用独立的数据库,再通过 jfinal 提供 http api 将服务连接起来。如果一定要分库分表,建议要建立一套自动化封装,让开发者不用关心分库分表的事情

IvyHelen

2016-08-12 15:25

@JFinal 恩,我们现在还不是提升效率做读写分离,我们现在主要的问题是单表信息可能太大。 我理清下思路,想下如何更好地处理。 如果可以,写个拓展MyDbPro等

JFinal

2016-08-12 15:50

单表信息在千万条记录以下都不算大,切勿提前优化

IvyHelen

2016-08-15 10:27

@JFinal 现在是在老系统做优化, 因为单表到2亿级别了,所以需要提前做好分库分表了。

IvyHelen

2016-08-15 10:36

@JFinal 到了一亿级别后,插入,查询都变得很慢

JFinal

2016-08-15 11:21

@IvyHelen 数据确实比较多了

IvyHelen

2016-08-15 11:32

@JFinal 恩,我先用当当开源的sharding-jdbc试下。

IvyHelen

2016-08-16 18:05

@JFinal sharding-jdbc看来不行,他支持的是固定的数据源。 我现在在写MyDBPro的方式,麻烦问下,这种情况下的处理方式。 我先根据过来用户的id 来判断下是否创建了数据库了,如果创建了的话使用,没有的话需要创建。 但是现在的问题是: 我怎么在AppConfig.java之外拿到configPlugin(Plugins me) 的me,好让我可以调用me.add(DruidPluginxx) 进行管理数据源。 我看到config类都是protect的,没有公开的方法可以调用。 麻烦了。

JFinal

2016-08-16 23:35

创建一个 Kit 工具类,里面弄个 static Map mapping 静态属性,在 AppConfig 中将 DruidPlugin 等需要的对象 put 到 Kit 中去,然后就可以随时获取了

JFinal

2016-08-16 23:36

@IvyHelen 当然,你也可以直接在 AppConfig 中创建 public static 属性来存放对象,供全局随时取用

IvyHelen

2016-08-17 09:15

@JFinal “创建一个 Kit 工具类,里面弄个 static Map mapping 静态属性,在 AppConfig 中将 DruidPlugin 等需要的对象 put 到 Kit 中去,然后就可以随时获取了” 这种情况下,会不会有不稳定的情况出现呢,比如我一边运行着一边me.add(newDruidPlugin) , 这时候还不能重启服务,新增加进去的druidplugin 起作用么?

JFinal

2016-08-17 09:16

@IvyHelen 解决好多线程协同的问题就好

IvyHelen

2016-08-17 09:18

@JFinal 恩,先试下这种情况,用threadlocal

JFinal

2016-08-17 09:24

@IvyHelen threadlocal 可配合拦截器使用一下

热门反馈

扫码入社