当前位置: 移动技术网 > IT编程>数据库>Mysql > 荐 NCAOS源码修改--适配PostgreSQL数据库

荐 NCAOS源码修改--适配PostgreSQL数据库

2020年07月30日  | 移动技术网IT编程  | 我要评论

概述

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网