The-Gamer-01
The-Gamer-01
Verifying this change需要通过和勾选下面的多选框
> Reference in new 因为之前Nacos内部是使用的JdbcTemplate,我先去看下JPA的相关的资料,比较一下
> 为啥不换成 jpa 🤪 JPA主要是用作访问数据库,可以看做是Mapper的方法的一种实现,Mapper的实现的话不做限制,由插件编写者自己决定,但是我可以尝试默认的抽象类使用JPA来方便我的编写
> 楼主那个方案短期内应该不适用,改动比较大吧。 > > 我本地自己基于Nacos2.1实现了一版多数据源的设计,支持核心config模块等,虽然其他辅助功能暂时未测试,常见的config操作都可以,目前支持PostgreSQL和Oracle,准备在支持下DB2,计划最近在抽取优化一下,然后开源一下。你们要是喜欢,我马上就开源,或提供Oracle版本的2.1打包的格式部署文件。修改文件截图如下:  > > 我的核心设计如下: 1、SPI初始化,增加DatabaseDialect方言类,封装分页等查询方法,使用方式为: dataSourceService = DynamicDataSource.getInstance().getDataSource(); databaseDialect = this.dataSourceService.databaseDialect(); > > ` @OverRide public String getTestQuery() { return " SELECT 1"; } >...
> > > 说个简单的方案 当前数据源的加载是由自己初始化完成的 只需要将数据源的加载方式改为可以由外部注入就可以了 对应数据源的具体的实现类还是通过Conditional让spring去加载对应的bean就行了 > > > > > > 感觉没办法解决sql 方言问题 > > 可以解决的 具体一点是这样 以 ExternalStoragePersistServiceImpl为列 他的实现是满足mysql的方言 他的加载条件是ConditionOnExternalStorage.matches为true 我们做这样一个修改 将他的加载条件改为 满足ConditionOnExternalStorage且数据库类型为mysql 这时如果我要使用第三方数据库,比如华为的gauss数据库 那么我自己去实现PersistService接口 并且将我的加载条件改为ConditionOnExternalStorage且数据库类型为gauss 这样方言的事情只需要让使用第三方数据库的人自己去适配就可以了...
> 是否可以考虑使用`spring-data-jdbc`的功能? 感觉Nacos毕竟不是数据库中间件,引入其他的ORM框架感觉是不是有点重了,JdbcTemplate 是对jdbc 封装的模板,灵活性高一些。并且nacos的相关表的操作都是固定下来的,短期内基本不会改动。所以就想先基于现有的方式改造下,
> 楼主的方案,个人觉得可以补充的是: 1、建议不影响Nacos核心外部调用PersistService的引用,同时将JdbcTemplate下沉到DB实现层 2、SPI不建议去封装那12张表的Mapper类,可以将那12张表的mapper组合到一个门面类里面,暴露的是多种数据库门面类的SPI,每个具体的SPI里面可以去维护Mapper 3、同时在PersistService类中引入委派模式,比如ExternalPersistDelegeService让,然后在委派里面调用SPI具体的某一个数据库的门面实现。 针对楼主的方案,个人补充的图片: > >  第一点我觉得确实不能影响对于外部调用PersistService的引用,可以做下修改;jdbc没有做spi中实现,这里面的SPI主要的是返回SQL语句的应该算是; 第二点我大概理解了就是希望能够将12个mapper组合到一个类中,然后插件编写者去实现这个SPI,在这个类中自己维护mapper;我觉得这种方法应该属于是在原有方案上的优化,因为mapper其实还是需要插件编写者自己去维护; 第三点我觉得SPI的可以通过单例的管理类去获取,我觉得可以暂时不用动的样子;
> 1. EmbeddedStorage、ExternalStorage的很多操作都写死了,建议把所有数据库存储方式统一对待,抽象出一套config storage需要的接口专门在一个package 如“com.alibaba.nacos.config.storage”,不同的storage实现放到不同的包如:“com.alibaba.nacos.config.storage.mysql”,“com.alibaba.nacos.config.storage.derby”,定制只要实现增加新的数据库接口实现就行了。 > 2. 不同的接口实现可以通过bean factory获取实现bean,或不把实现直接声明为bean,集中到一个config类声明为bean,再在config类通过config condition注解,通过配置来判断使用那个数据库实现。 现在的方案跟这个差不多,有些微差别但是我也注意到了这个问题;第二点的话工厂模式的话可能得慢慢来,因为这是一个大工程。
> Worked for me on this way: > > ``` > import VueMermaid from "vue-mermaid/src"; > Vue.use(VueMermaid); > ``` Thanks, works for me.
这个issue现在完成了吗,还需要帮助吗