独家首发! java助力mycat实现动态添加数据源, 实现新增租户秒登独立数据库
Posted 李昊轩的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独家首发! java助力mycat实现动态添加数据源, 实现新增租户秒登独立数据库相关的知识,希望对你有一定的参考价值。
这里先简单介绍一下背景, 防止看官迷糊
- 首先手上有一个项目要实现分库, 技术选型为mycat
- A(运维系统), B(SaaS系统)
- 目标效果(时间顺序 -> 1 -> 2 -> 3 -> 4):
- 管理员在A系统新增租户时
- 新建并初始化新租户的数据库
- java程序自动在mycat的配置中添加新增租户的配置
- 向mycat发送reload命令, 失败自动触发重试机制.
- 新租户直接在B系统登录成功.
由于我怀疑File这个类的在mac和linux的native方法有略微区别, 导致了了之前文件没办法rename的bug, 所以这里写的有点笨重, 但是上线时间紧迫就不做修改了, 大家凑合着.
private static void addMycatConfig(String no, String configPath, String configFileName) throws Exception {
String rawStr = " <dataNode name=\\"%s\\" dataHost=\\"localhost1\\" database=\\"%s\\" />";
String lineInserted = String.format(rawStr, no, CustomerDbService.getDbNameByCustomerId(no));
String tempPath = configPath + "schematemp.xml";
File tempFile = new File(tempPath);
File realConfigFile = new File(configPath + configFileName);
BufferedReader br = new BufferedReader(new FileReader(realConfigFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(tempFile));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
if (line.trim().startsWith("<schema")) {
bw.write(lineInserted);
bw.newLine();
}
}
bw.flush();
realConfigFile.renameTo(new File(configPath + "schema_backup_" + System.currentTimeMillis() + ".xml"));
tempFile.renameTo(new File(configPath + configFileName));
}
reload代码简单发下, 充实策略就是简简单单的开启线程, 注意一下别重复开启重试就好.
String jdbcUrl = CustomerDbService.getMycatDbUrlFromConfig();
String username = ApplicationConfig.getInstance().getConfig(CustomerDbService.MYCAT_MANAGE_USER, "");
String passwd = ApplicationConfig.getInstance().getConfig(CustomerDbService.MYCAT_MANAGE_PWD, "");
conn = DriverManager.getConnection(jdbcUrl, username, passwd);
Statement statement = conn.createStatement();
String refreshCommand = "reload @@config_all;";
statement.execute(refreshCommand);
statement.close();
以上是关于独家首发! java助力mycat实现动态添加数据源, 实现新增租户秒登独立数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用CGLib动态代理jdbc原生类来实现应用层无感知的proxy层面的SaaS分库支持