网站下载免费的视频软件,wordpress电子商务中文主题,网站写动态新闻有什么好处,织梦帝国和wordpress背景
随着项目规模的扩大#xff0c;单一数据源已无法满足复杂业务需求#xff0c;多数据源应运而生。
技术选型
MyBatis-Plus 的官网提供了两种多数据源扩展插件#xff1a;开源生态的 font stylecolor:rgb(53, 56, 65);dynamic-datasource/fon…背景
随着项目规模的扩大单一数据源已无法满足复杂业务需求多数据源应运而生。
技术选型
MyBatis-Plus 的官网提供了两种多数据源扩展插件开源生态的 font stylecolor:rgb(53, 56, 65);dynamic-datasource/font 和 企业级生态的 font stylecolor:rgb(53, 56, 65);mybatis-mate/font。
这里遵循开源免费的原则选择前者dynamic-datasource集成到平台中来。
dynamic-datasource
font stylecolor:rgb(53, 56, 65);dynamic-datasource/font 是一个开源的 Spring Boot 多数据源启动器提供了丰富的功能包括数据源分组、敏感信息加密、独立初始化表结构等。
数据源分组适用于多种场景如读写分离、一主多从等。敏感信息加密使用 font stylecolor:rgb(53, 56, 65);ENC()/font 加密数据库配置信息。独立初始化支持每个数据库独立初始化表结构和数据库。自定义注解支持自定义注解需继承 font stylecolor:rgb(53, 56, 65);DS/font。简化集成提供对 Druid、HikariCP 等连接池的快速集成。组件集成支持 Mybatis-Plus、Quartz 等组件的集成方案。动态数据源支持项目启动后动态增加或移除数据源。分布式事务提供基于 Seata 的分布式事务方案。
实现
添加maven依赖
首先需要考虑的把依赖加到哪个模块下。数据源属于底层实现平台的核心模块如system、support、entity-config以及能力扩展模块如mail、notification等还有基于平台构建的业务功能模块都有可能在某些特定情况下使用不同的数据源。
因此将其放在平台最底层的common模块中加载最合理。
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion4.3.1/version
/dependency注意开发平台使用的spring boot版本是2.3.0因此使用的dynamic-datasource组件对应是dynamic-datasource-spring-boot-starter如果对应的spring boot版本是3.x则需要使用dynamic-datasource-spring-boot3-starter。
配置数据源
修改yml配置官方示例如下
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_1:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: ENC(xxxxx)username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver官方示例没有给出druid的相关处理到dynamic-datasource的官网查看如何集成druid居然需要付费查看
然后通过ai和百度参照配置druid如下
spring:datasource:dynamic:primary: master # 设置默认数据源strict: false # 是否严格匹配数据源datasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/abc?useUnicodetruecharacterEncodingutf-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: rootdruid:# 连接池的配置信息# 初始化大小最小最大initial-size: 5min-idle: 5maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间单位是毫秒minEvictableIdleTimeMillis: 120000# 检测连接是否有效使用的sql语句validationQuery: SELECT 1# 空闲时检测连接有效性testWhileIdle: true# 申请时检测连接有效性testOnBorrow: false# 归还时检测连接有效性testOnReturn: false# 连接池中的minIdle数量以内的连接空闲时间超过minEvictableIdleTimeMillis则会执行keepAlive操作。实际项目中建议配置成truekeepAlive: true# 配置监控统计拦截的filtersfilters: mergeStat# 配置web监控web-stat-filter:enabled: trueurl-pattern: /*exclusions: *.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*# 配置监控页面stat-view-servlet:enabled: trueurl-pattern: /druid/*# 登录名login-username: admin# 登录密码login-password: 1234lwq# IP白名单(没有配置或者为空则允许所有访问)allow:# IP黑名单 (共同存在时deny优先于allow)deny:启动项目查看日志输出发现druid连接池并没有生效使用的是SpringBoot默认的HikariDataSource连接池如下
08:30:39.771 INFO [main ] com.zaxxer.hikari.HikariDataSource - master - Starting...
08:30:40.101 INFO [main ] com.zaxxer.hikari.HikariDataSource - master - Start completed.查阅了大量资料尝试更换了N种配置法更换了N个druid、dynamic-datasource的版本都无法正常使用要么像上面一样使用的不是druid连接池要么是启动环节报错配置项解析无效。
在上面花费了大量时间没有结果在这里吐槽一句作为一个插件如何配置druid连接池要付费29.9才能查看文档并且即使付了费也不一定解决问题这就比较坑了。
不死心去翻源码发现包com.baomidou.dynamic.datasource.creator下的DataSourceProperty.java中有这么一句 又经过了反复尝试和验证把druid-starter的版本号从1.2.18降低到了1.1.10才生效。
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version
/dependency
这时候的启动信息看上去正常了如下
11:24:25.549 WARN [main ] com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator - dynamic-datasource current not support [mergeStat]
11:24:25.973 INFO [main ] com.alibaba.druid.pool.DruidDataSource - {dataSource-1,master} inited
11:24:25.977 INFO [main ] com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource - add a datasource named [master] success
11:24:25.978 INFO [main ] com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource initial loaded [1] datasource,primary datasource named [master]在原来基础上增加一套数据库配置进行验证如下 datasource:dynamic:primary: master # 设置默认数据源strict: false # 是否严格匹配数据源datasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/abc?useUnicodetruecharacterEncodingutf-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: rootmeet:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/meet?useUnicodetruecharacterEncodingutf-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: root启动时控制台输出如下
11:32:47.234 WARN [main ] com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator - dynamic-datasource current not support [mergeStat]
11:32:47.743 INFO [main ] com.alibaba.druid.pool.DruidDataSource - {dataSource-1,meet} inited
11:32:47.746 WARN [main ] com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator - dynamic-datasource current not support [mergeStat]
11:32:47.776 INFO [main ] com.alibaba.druid.pool.DruidDataSource - {dataSource-2,master} inited
11:32:47.777 INFO [main ] com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource - add a datasource named [meet] success
11:32:47.777 INFO [main ] com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource - add a datasource named [master] success
11:32:47.777 INFO [main ] com.baomidou.dynamic.datasource.DynamicRoutingDataSource - dynamic-datasource initial loaded [2] datasource,primary datasource named [master]默认使用的是master数据源所以平台原有功能未受影响。
然后把druid的版本换回1.2.18居然发现也正常了这就非常诡异了……反复清理与编译问题没有重现。
但是验证到druid内置监控器的时候发现无法正常访问了改回1.1.10版本则恢复正常。
整理一下最终测试有效的各组件版本及配置如下
SpringBoot 2.3.0.REALEASE
dynamic-datasource版本4.3.1
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion4.3.1/version
/dependencydruid-spring-boot-starter版本1.1.10如下
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version
/dependency系统yml配置文件多数据源相关如下
#数据连接
spring:datasource:dynamic:primary: master # 设置默认数据源strict: false # 是否严格匹配数据源datasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/abc?useUnicodetruecharacterEncodingutf-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: rootmeet:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/meet?useUnicodetruecharacterEncodingutf-8useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/ShanghaiallowMultiQueriestrueusername: rootpassword: rootdruid:# 连接池的配置信息# 初始化大小最小最大initial-size: 5min-idle: 5maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间单位是毫秒minEvictableIdleTimeMillis: 120000# 检测连接是否有效使用的sql语句validationQuery: SELECT 1# 空闲时检测连接有效性testWhileIdle: true# 申请时检测连接有效性testOnBorrow: false# 归还时检测连接有效性testOnReturn: false# 连接池中的minIdle数量以内的连接空闲时间超过minEvictableIdleTimeMillis则会执行keepAlive操作。实际项目中建议配置成truekeepAlive: true# 配置监控统计拦截的filtersfilters: mergeStat# 配置web监控web-stat-filter:enabled: trueurl-pattern: /*exclusions: *.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*# 配置监控页面stat-view-servlet:enabled: trueurl-pattern: /druid/*# 登录名login-username: admin# 登录密码login-password: 1234lwq# IP白名单(没有配置或者为空则允许所有访问)allow:# IP黑名单 (共同存在时deny优先于allow)deny:
这里其实还有一个问题两个数据源本打算配置多个druid的监控了实际测试发现把druid配置放在各个数据源配置项下并不会生效只有放在最外层如上图所示才可以正常打开监控页面并且监控的是master主数据库的监控。可以通过修改primary指向meet数据库从而监控的数据源也发生了变化。实际上同一时间段durid只监控一个数据源先前的想法为不同的数据源配置不同的监控页面应该是不可行的。
此外网上查到的大量问题提到需要将druid的自动化配置排除在yml配置中移除如下
spring:autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:……或者在SpringBoot启动类注解中配置exclude {DataSourceAutoConfiguration.class}移除如下
SpringBootApplication(scanBasePackages tech.abc, exclude {DataSourceAutoConfiguration.class})
MapperScan(tech.abc.**.mapper)
EnableConfigurationProperties({PlatformConfig.class, AppConfig.class})
Slf4j
EnableRetry
public class PlatformBootApplication implements CommandLineRunner {在以上版本中测试中并不需要推测很可能是dynamic-datasource历史上某些版本需要这么操作。
通过注解指定数据源
上面经历了很多曲折接下来的事情就简单了主数据源作为默认不用做任何额外的工作。
某些实体服务需要使用其他数据源在对应的服务实现类ServiceImpl中添加注解DS(“数据源名称”)这里的数据源名称对应着yml文件中配置的数据源然后就可以了。
示例如下
package tech.abc.dynamicdatasource;import com.baomidou.dynamic.datasource.annotation.DS;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import tech.abc.dynamicdatasource.mapper.TaskCategoryMapper;
import tech.abc.platform.common.base.BaseServiceImpl;/*** author wqliu* date 2025-03-09*/
DS(meet)
Slf4j
Service
public class TaskCategoryServiceImpl extends BaseServiceImplTaskCategoryMapper, TaskCategory implements TaskCategoryService {public void test() {long count this.count();log.info(count:{}, count);}
}
在启动类里调用了以下方法进行测试如下
Override
public void run(String... ) throws Exception {// 启动消息服务端startMessageServer();taskCategoryService.test();
}控制台输出日志功能正常如下
10:28:48.720 INFO [main ] tech.abc.dynamicdatasource.TaskCategoryServiceImpl - count:10新问题及解决
按照上述模式实现了多数据源功能后在平台功能测试环节发现出了问题系统可以正常启动无报错但是登录环节查询用户数据时提示无法获取到create_time字段如下所示
### Error querying database. Cause: org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column create_time from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException
### Cause: org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column create_time from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedExceptionat org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)... 62 common frames omitted
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column create_time from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedExceptionat org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:96)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)at com.sun.proxy.$Proxy89.select(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.select(SqlSessionTemplate.java:248)at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeWithResultHandler(MybatisMapperMethod.java:155)at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:74)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)at com.sun.proxy.$Proxy171.selectList(Unknown Source)at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:227)at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)at com.sun.proxy.$Proxy171.selectOne(Unknown Source)at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:214)at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166)at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)at com.sun.proxy.$Proxy171.selectOne(Unknown Source)at com.baomidou.mybatisplus.extension.conditions.query.ChainQuery.lambda$one$cd9f9c92$1(ChainQuery.java:59)at com.baomidou.mybatisplus.extension.conditions.ChainWrapper.execute(ChainWrapper.java:63)at com.baomidou.mybatisplus.extension.conditions.query.ChainQuery.one(ChainQuery.java:59)at com.baomidou.mybatisplus.extension.conditions.query.ChainQuery.oneOpt(ChainQuery.java:69)at tech.abc.platform.entityconfig.service.impl.EntityModelDataPermissionServiceImpl.getDataPermissionSqlPart(EntityModelDataPermissionServiceImpl.java:118)at tech.abc.platform.entityconfig.service.impl.EntityModelDataPermissionServiceImpl$$FastClassBySpringCGLIB$$1a9fef99.invoke(generated)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)at tech.abc.platform.entityconfig.service.impl.EntityModelDataPermissionServiceImpl$$EnhancerBySpringCGLIB$$17a19d87.getDataPermissionSqlPart(generated)at tech.abc.platform.framework.extension.MyDataPermissionHandler.getSqlSegment(MyDataPermissionHandler.java:42)at com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor.buildTableExpression(DataPermissionInterceptor.java:146)at com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor.lambda$builderExpression$3(BaseMultiTableInnerInterceptor.java:386)at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)at com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor.builderExpression(BaseMultiTableInnerInterceptor.java:388)at com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor.processPlainSelect(BaseMultiTableInnerInterceptor.java:113)at com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor.setWhere(DataPermissionInterceptor.java:101)at com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor.processSelect(DataPermissionInterceptor.java:85)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.processParser(JsqlParserSupport.java:90)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:49)at com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor.beforeQuery(DataPermissionInterceptor.java:64)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)at com.sun.proxy.$Proxy193.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)... 69 common frames omitted
Caused by: java.sql.SQLFeatureNotSupportedException: nullat com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1771)at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:39)at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:29)at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:582)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:412)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:362)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:333)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:309)at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)at com.sun.proxy.$Proxy194.query(Unknown Source)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:333)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)at com.sun.proxy.$Proxy193.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)at org.apache.ibatis.session.defaults.DefaultSqlSession.select(DefaultSqlSession.java:174)at org.apache.ibatis.session.defaults.DefaultSqlSession.select(DefaultSqlSession.java:164)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)... 116 common frames omitted从错误日志来推测很像是druid的版本比较低对于LocalDateTime类型无法正常识别和转换。
然后将druid版本升级为1.2.18启动正常功能正常但druid监控功能无法打开。 后来又尝试了1.2.11.1.21这两个版本跟1.2.18版本的效果一样未找到一个可以二者兼顾的版本。 综合考虑下将版本设置为了较新的1.2.18优先保证多数据源功能正常。如果项目中没用到多数据源功能更希望使用durid监控功能则建议将版本设置为1.1.10。
开源平台资料
平台名称一二三应用开发平台 简介 企业级通用低代码应用开发平台免费全开源可商用 设计资料csdn专栏 开源地址Gitee 开源协议MIT 如果您在阅读本文时获得了帮助或受到了启发我衷心希望您能够喜欢并收藏这篇文章为它点赞并在评论区与我分享您的想法和心得。让我们一起交流学习不断进步遇见更加优秀的自己