Jboot通过ShardingJDBC实现分库分表,但是分库分表函数主要是通过字段值进行计算,但如果分库方式与数据无关,并且分库需要在运行时动态新增配置就无法满足要求。
下面是通过改造基本Model类,并动态配置数据源的方法:
1、新增数据源缓存类
注意,configName要使用线程本地类,JBoot非线程安全。
public class DataConfigName {
private static DataConfigName me;
@JSONField(serialize = false)
transient private ThreadLocal<String> configName = new ThreadLocal<>();
private DataConfigName(){}
public static DataConfigName getInstance(){
if(me == null){
me = new DataConfigName();
}
return me;
}
public void setConfigName(String name){
configName.set(name);
}
public String getConfigName(){
String name = configName.get();
if(null == name){
name = DbKit.MAIN_CONFIG_NAME;
}
return name;
}
}
2、修改Model基础类
JBoot操作数据库主要通过Model来实现,框架提供了基础类JBootModel,需要对这个类进行扩展,覆盖所有方法,如下所示,方法中都增加了use子句,实现数据源的切换,否则会使用默认数据源:
public class GlueModel<M extends GlueModel<M>> extends JbootModel<M> {
public GlueModel(){};
……
public M use(String configName) {
return super.use(configName);
}
M superUse(String configName) {
return super.use(configName);
}
public boolean saveOrUpdate() {
this.use(DataConfigName.getInstance().getConfigName());
return super.saveOrUpdate();
}
public boolean save() {
this.use(DataConfigName.getInstance().getConfigName());
return super.save();
}
……
}
3、替换所有Db类的操作,增加use子句,如:
public class TransactionModel extends GlueModel<TransactionModel> {
……
public static TransactionModel getByTno(String tno){
……
Record record = Db.use(DataConfigName.getInstance().getConfigName()).findFirst(sql);
……
}
……
}
4、创建一个数据源动态管理类。
Jboot虽然在2.1.2版本的DataSourceConfigManager类中开放了addConfig方法,但由于Db类是属于JFinal框架的,无法影响到,因此需要调用JFinal的DbKit的addConfig方法完成数据源的新增。
下面的代码只提供了从默认数据库获取数据源配置参数的实现方式,如果需要通过本地配置文件、网络文件等方式,可参考自行添加
public class DynamicDataSourceManager {
/**
* 从数据库获取数据源配置参数
* @param tableName
* @param corpId
* @return
*/
public static Config loadConfigFromDB(String tableName, String corpId){
Config config = DbKit.getConfig(corpId);
if(null == config) {
SqlPara sql = new SqlPara();
sql.setSql("select * from " + tableName + " where corpid=?").addPara(corpId);
List<Record> records = Db.find(sql);
if (null != records && records.size()>0) {
Record record = records.get(0);
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setName(record.getStr("corpid"));
dataSourceConfig.setType(DataSourceConfig.TYPE_MYSQL);
dataSourceConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSourceConfig.setUrl("jdbc:mysql://"
+ record.getStr("write_host")
+ ":" + record.getStr("write_port")
+ "/"
+ record.getStr("write_database")
+ "?useUnicode=true&characterEncoding="
+ record.getStr("charset")
+ "&useSSL=false");
dataSourceConfig.setUser(record.getStr("write_username"));
dataSourceConfig.setPassword(record.getStr("write_password"));
dataSourceConfig.setPoolName(record.getStr("write_database"));
DataSource dataSource = new DataSourceBuilder(dataSourceConfig).build();
config = new Config(
record.getStr("corpid"),
dataSource,
new MysqlDialect(),
false,
false,
DbKit.DEFAULT_TRANSACTION_LEVEL,
IContainerFactory.defaultContainerFactory,
new EhCache()
);
DbKit.addConfig(config);
}
}
return config;
}
}
5、在切片方法或入口方法中实现数据源的配置
……
if(null != corpId){
Config config = DynamicDataSourceManager.loadConfigFromDB("corp_database", corpId);
if(null != config) {
DataConfigName.getInstance().setConfigName(corpId);
}
}
……
通过上述修改即可完成动态分库处理,实际的Model中无需再做任何特殊处理。
分享到:
相关推荐
jboot+dubbo+nacos例子
java语言,jboot框架,WebSocket测试
基于Vue iView开发的jboot前台 权限可控制至按钮 动态路由权限菜单/多语言/简洁美观
jboot开发资源
jboot多maven模块打包例子
基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于JBoot的简单Admin.zip基于...
这个是java的jboot远程调用的内容,在使用的时候得有consul和motan安装好并且运行。
Jboot是一个基于JFinal 和 Undertow...提供了AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、swagger api自动生成、Opentracing数据追踪、metric数据监控、分布式session、代码生成器、shiro安全控制等功能。
jboot-admin是基于jboot全家桶构建的微服务实战项目,以微服务快速迭代开发为架构思想,-jboot-admin
提供了AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、swagger api自动生成、Opentracing数据追踪、metrics数据监控、分布式session、代码生成器、shiro安全控制等功能。 Jboot 的核心组件 1、MVC (基于...
一个基于 JFinal 的国产微服务框架,SpringCloud 之外的另一个选择,已经使用在用户量过亿的商业产品上,目前有超过 1000 家公司在使用 Jboot 做极速开发...
Jboot微服务框架 v4.1.5.zip
Jboot微服务框架 v3.17.1.zip
Jboot 是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架, 帮助...5、基于 Apollo 和 Nacos 的分布式配置中心 6、基于 EhCache 和 Redis 的分布式二级缓存
jboot-admin是基于jboot全家桶构建的微服务实战项目,以微服务快速迭代开发为架构思想,目前包含后台管理模块、微信公众号模块,将来计划按照电商业务加入秒杀、商品、订单、app、小程序等模块。微服务模块分为api层...
jboot websocket的使用-附件资源
JBoot 在线Demo 前台为基于Vue+iView的独立项目请跳转至 项目仓库查看 项目简介 代码拥有详细注释 学习与实战的不错选择 核心使用目前最新 SpringBoot 2.0.1.RELEASE JPA + Mybatis-Plus任意切换 项目持久层默认推荐...