一、该问题的重现步骤是什么?
1. 配置了 mysql + clickhouse
2. 使用 @DS 来切换数据源(mysql是主,切到clickhouse)
3. 为了实现 @DS 注解实现了
DataSourceConfig
DS
DynamicDataSource
DynamicDataSourceAspect
DynamicDataSourceContextHolder
二、你期待的结果是什么?实际看到的又是什么?
期待能正常访问 clickhouse。 现在访问 mysql 和 clickhouse 报相同的错误
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex,Windows
四、请提供详细的错误堆栈信息,这很重要。
2024-08-30 16:19:51.513 ERROR 17604 --- [ async-task-7] o.s.c.b.c.BladeExecutorConfiguration : Unexpected exception occurred invoking async method: public void org.springblade.common.event.ErrorLogListener.saveErrorLog(org.springblade.core.log.event.ErrorLogEvent)
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.springblade.modules.system.mapper.LogErrorMapper.insert
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:229)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:96)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36)
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
at com.sun.proxy.$Proxy197.insert(Unknown Source)
at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60)
at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)
at org.springblade.modules.system.service.impl.LogErrorServiceImpl$$EnhancerBySpringCGLIB$$424a4089.save(<generated>)
at org.springblade.modules.system.service.impl.LogServiceImpl.saveErrorLog(LogServiceImpl.java:38)
at org.springblade.common.event.ErrorLogListener.saveErrorLog(ErrorLogListener.java:55)
at org.springblade.common.event.ErrorLogListener$$FastClassBySpringCGLIB$$d15d923a.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
at org.springblade.core.log.aspect.LogTraceAspect.around(LogTraceAspect.java:41)
at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.springblade.core.context.BladeRunnableWrapper.run(BladeRunnableWrapper.java:54)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
五、若有更多详细信息,请在下面提供。
org.springblade.job.controller; org.apache.ibatis.session.SqlSessionFactory; org.mybatis.spring.SqlSessionFactoryBean; org.mybatis.spring.annotation.; org.springframework.beans.factory.annotation.; org.springframework.boot.context.properties.; org.springframework.boot.jdbc.DataSourceBuilder; org.springframework.context.annotation.; org.springframework.context.annotation.; org.springframework.context.annotation.; org.springframework.core.io.support.PathMatchingResourcePatternResolver; org.springframework.jdbc.core.JdbcTemplate; org.springframework.jdbc.datasource.DataSourceTransactionManager; javax.sql.DataSource; (basePackages = , sqlSessionFactoryRef = ) DataSourceConfig { (name = ) (prefix = ) DataSource () { DataSourceBuilder.().build(); } (name = ) (prefix = ) DataSource () { DataSourceBuilder.().build(); } (name = ) SqlSessionFactory (() DataSource dataSource) Exception { SqlSessionFactoryBean sessionFactory = SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(PathMatchingResourcePatternResolver().getResources()); sessionFactory.getObject(); } (name = ) DataSourceTransactionManager (() DataSource dataSource) { DataSourceTransactionManager(dataSource); } (name = ) SqlSessionFactory (() DataSource dataSource) Exception { SqlSessionFactoryBean sessionFactory = SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(PathMatchingResourcePatternResolver().getResources()); sessionFactory.getObject(); } (name = ) DataSourceTransactionManager (() DataSource dataSource) { DataSourceTransactionManager(dataSource); } (name = ) JdbcTemplate (() DataSource dataSource) { JdbcTemplate(dataSource); } (name = ) JdbcTemplate (() DataSource dataSource) { JdbcTemplate(dataSource); } }
org.springblade.job.controller; java.lang.annotation.*; ({ElementType., ElementType.}) (RetentionPolicy.) @{ String () ; }
org.springblade.job.controller; org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; DynamicDataSource AbstractRoutingDataSource { ThreadLocal<String> = ThreadLocal<>(); (String dataSourceType) { .set(dataSourceType); } String () { .get(); } () { .remove(); } Object () { (); } }
org.springblade.job.controller; org.aspectj.lang.JoinPoint; org.aspectj.lang.annotation.; org.aspectj.lang.annotation.; org.aspectj.lang.annotation.; org.springframework.stereotype.; DynamicDataSourceAspect { () (JoinPoint point, ds) { DynamicDataSourceContextHolder.(ds.value()); } () (JoinPoint point, ds) { DynamicDataSourceContextHolder.(); } }
org.springblade.job.controller; DynamicDataSourceContextHolder { (String dataSourceType) { DynamicDataSource.(dataSourceType); } String () { DynamicDataSource.(); } () { DynamicDataSource.(); } }
自定义了包名没有做扫描导致的问题,具体请看:https://sns.bladex.cn/q-1373.html
扫一扫访问 Blade技术社区 移动端