荐 NCAOS源码修改--适配PostgreSQL数据库
概述
nacos现在除了自身的内嵌数据库外,只支持mysql数据库,由于工作需要,需要将nacos连接到postgresql数据库,查看源码之后发现源码中只兼容了mysql数据库,需要对源码进行修改。刚毕业的小白,有什么错误欢迎大佬指点!!!
修改思路
首先修改配置项,将配置mysql的位置加入判断条件,兼容postgresql;其次修改判断语句,源码中有许多判断是否使用mysql的位置,如没有用mysql且单机模式启动,则会加载内嵌数据库,此处加上postgresql的判断条件;最后,修改nacos中mysql与postgresql在sql语句方面的不同,例如postgresql用``包裹字段会报错,不支持limit m,n的写法。
nacos版本:1.1.4
package com.alibaba.nacos.config.server.service
主要内容位于这个包内,下面按照每个修改的类进行描述
BasicDataSourceServiceImpl
对mysql的加载位于这个类中,由于想要动态判断加载mysql或postgresql驱动,删掉了static代码块,在reload方法中加入了如下代码
if (env.getProperty("spring.datasource.platform").equals("postgresql")) {
JDBC_DRIVER_NAME = DEFAULT_POSTGRESQL_DRIVER;
log.info("Use PostgreSQL as the driver");
}else {
try {
Class.forName(MYSQL_HIGH_LEVEL_DRIVER);
JDBC_DRIVER_NAME = MYSQL_HIGH_LEVEL_DRIVER;
log.info("Use Mysql 8 as the driver");
} catch (ClassNotFoundException ex) {
log.info("Use Mysql as the driver");
JDBC_DRIVER_NAME = DEFAULT_MYSQL_DRIVER;
}
其次下面加入了if else语句,将原本的for循环放到了else中,if中加入判断条件,若是postgresql数据库,复制一份mysql的加载过程,将其中 db. + i 等修改为自己配置文件中的配置即可。
if (JDBC_DRIVER_NAME == DEFAULT_POSTGRESQL_DRIVER) {
String val = null;
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(JDBC_DRIVER_NAME);
val = env.getProperty("db.url");
if (null == val) {
fatalLog.error("db.url is null");
throw new IllegalArgumentException();
}
ds.setUrl(val.trim());
val = env.getProperty("db.user", env.getProperty("db.user"));
if (null == val) {
fatalLog.error("db.user is null");
throw new IllegalArgumentException();
}
ds.setUsername(val.trim());
val = env.getProperty("db.password", env.getProperty("db.password"));
if (null == val) {
fatalLog.error("db.password is null");
throw new IllegalArgumentException();
}
ds.setPassword(val.trim());
val = env.getProperty("db.initialSize", env.getProperty("db.initialSize"));
ds.setInitialSize(Integer.parseInt(defaultIfNull(val, "10")));
val = env.getProperty("db.maxActive", env.getProperty("db.maxActive"));
ds.setMaxActive(Integer.parseInt(defaultIfNull(val, "20")));
val = env.getProperty("db.maxIdle", env.getProperty("db.maxIdle"));
ds.setMaxIdle(Integer.parseInt(defaultIfNull(val, "50")));
ds.setMaxWait(3000L);
ds.setPoolPreparedStatements(true);
// 每10分钟检查一遍连接池
ds.setTimeBetweenEvictionRunsMillis(TimeUnit.MINUTES.toMillis(10L));
ds.setTestWhileIdle(true);
ds.setValidationQuery("SELECT 1 ");
dblist.add(ds);
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setQueryTimeout(queryTimeout);
jdbcTemplate.setDataSource(ds);
testJTList.add(jdbcTemplate);
isHealthList.add(Boolean.TRUE);
if (dblist == null || dblist.size() == 0) {
throw new RuntimeException("no datasource available");
}
dataSourceList = dblist;
new SelectMasterTask().run();
new CheckDBHealthTask().run();
}
DynamicDataSource;LocalDataSourceServiceImpl; ConfigService;
这三个类中主要是在原本的判断条件后面加入了postgresql的判断条件,如下
if (STANDALONE_MODE && !propertyUtil.isStandaloneUseMysql() && !propertyUtil.isStandaloneUsePostgreSql())
对应添加即可。(ps,可以用搜索功能搜索所有此类语句,基本需要全部更改)
propertyUtil.isStandaloneUsePostgreSql()方法
ctrl + 左键 转到propertyUtil类中,模仿mysql的方法新增PostgreSql相关方法和属性。
package com.alibaba.nacos.config.server.utils;
本包中主要是sql相关,主要目的是修改limit语句,通过源码可以看到,本身nacos就因为mysql的limit在内嵌数据库中不支持写了判断语句修改sql
if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUsePostgreSql()) {
selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
}
因此,相关位置只需要根据原本的判断条件,加入如下代码:
if(STANDALONE_MODE && PropertyUtil.isStandaloneUsePostgreSql()) {
selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? LIMIT ? ");
}
将limit ?,? 替换为 OFFSET ? LIMIT ?即可
最后
使用搜索替换功能,删掉sql语句中所有的`
记得修改配置文件并在启动项加入
-Dnacos.standalone=true -Dnacos.home=D:\nacos-server-1.1.4\nacos-1.1.4\distribution
修改的类如下
package com.alibaba.nacos.config.server.service:
BasicDataSourceServiceImpl;
DynamicDataSource;
LocalDataSourceServiceImpl;
ConfigService;
package com.alibaba.nacos.config.server.service.capacity:
GroupCapacityPersistService;
TenantCapacityPersistService
package com.alibaba.nacos.config.server.controller:
ConfigServletInner;
package com.alibaba.nacos.config.server.utils:
PaginationHelper;
PropertyUtil;
Github连接如下
https://github.com/CNWangTy/nacos
有错误的话希望大家给我指出,并球球大家教教我怎么解决!万分感激!
本文地址:https://blog.csdn.net/SdWangTy/article/details/107639663
下一篇: MySQL中sql语句的应用