Java中JFinal框架动态切换数据库的方法

网友投稿 401 2022-10-31


Java中JFinal框架动态切换数据库的方法

需求:需要根据企业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(“”);


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api接口文档(api接口文档模板)
下一篇:在线接口文档(在线接口文档编写)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~