Java中JFinal框架动态切换数据库的方法
时间:2021-08-02 07:30:39|栏目:JAVA代码|点击: 次
需求:需要根据企业ID切换对应的数据库,同时,后期可动态增加数据库配置
JFinal框架中对于对于多数据源配置有两种方式:
1.通过配置文件配置,有多少数据库就要配置多少,服务启动时加载所有数据库,缺点:不能动态增加数据库
2.只配置一个主数据库信息就可以了,其他数据库信息保存在表中,通过读取表数据加载数据库连接,优点:在数据表中增加数据库配置即可动态增加数据库连接。
本次主要介绍第2种方法:
一、新建数据表:保存数据库连接信息

配置表对应的实体类
public class DbDto {
/**
* 企业ID
*/
private String comp_id;
/**
* 企业名称
*/
private String comp_name;
/**
* 企业数据库名
*/
private String dbname;
/**
* 连接地址(ip + 端口号)
*/
private String dbhost;
/**
* 用户名
*/
private String dbuser;
/**
* 用户密码
*/
private String dbpwd;
/**
* 表名前缀
*/
private String prefix;
/**
* 编码类型
*/
private String charset;
/**
* 默认库(1:是 0:不是)
*/
private String is_default;
}
二、切换数据库公共方法,根据企业ID切换对应的数据库(需要依赖druid)
/**
* 根据企业ID查询对应数据库
*
* @param compId 企业ID
* @return 数据库配置名
* @throws Exception 返回处理异常
*/
public static String chooseDbByCompId(String compId) throws Exception{
//企业ID为空时,默认使用主数据库
if (StringUtils.isBlank(compId)){
return SYS_TABLE.MASTER_DB;
}
DbDto dbDto;
try {
//查询Redis缓存的compId对应的数据库配置信息
String jsonStr = RedisClient.getString(SYS.REDIS_COMP_DB + compId);
if (StringUtils.isNotBlank(jsonStr)){
dbDto = JSONObject.parseObject(jsonStr, DbDto.class);
}else {
//缓存不存在,查询数据库
Record dbRecord = Db.use(SYS_TABLE.MASTER_DB).findFirst("select * from 配置表 where comp_id = ? ", compId);
//parseObject方法是自己封装的Record转实体类方法,在前面的文章有写过,也是在这个工具类中
dbDto = parseObject(dbRecord, DbDto.class);
//加入缓存
if (dbDto != null){
RedisClient.setString(SYS.REDIS_COMP_DB + compId, JSONObject.toJSONString(dbDto));
}
}
if (dbDto == null){
logger.info("切换数据库失败,企业不存在或无对应数据库配置!");
return null;
}
//是否已存在该数据库连接
if (DbKit.getConfig(dbDto.getDbname()) == null){
//创建数据库连接
DruidPlugin plugin = new DruidPlugin("jdbc:mysql://" + dbDto.getDbhost()+ "/"+dbDto.getDbname(), dbDto.getDbuser(), dbDto.getDbpwd());
plugin.start();
ActiveRecordPlugin arp= new ActiveRecordPlugin(dbDto.getDbname(), plugin);
arp.start();
}
}catch (Exception e){
logger.error("捕获异常: 切换数据库失败!", e);
return null;
}
return dbDto.getDbname();
}
这样根据参数compId即可动态选择参数对应的数据库(CommonUtil是我封装这个方法的工具类)
Db.use(CommonUtil.chooseDbByCompId(compId)).find(“”);
栏 目:JAVA代码
本文地址:http://www.codeinn.net/misctech/163603.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




