1.遇到的问题

我们使用若依框架,首先这个框架完全开源,真的是很牛也很友好的框架。不像芋道各种关注各种收费,看个文档还要加入199的知识星球,真是恶心,个人觉得完全没必要,若依提供的扩展项目中都做了集成,需要哪一块自己复制过来。

先看报错:

2023-09-25 17:20:56 [pool-5-thread-1] ERROR c.e.c.c.s.m.o.u.t.HandleThread [] [] - 执行错误:{}
org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: Table 'gary_table.kc_20230925' doesn't exist
### The error may exist in URL [jar:file:/data/bin/gary/test/test-ob/test-ob.jar!/BOOT-INF/lib/test-ob-system-1.0.0.jar!/mapper/gary/testObMapper.xml]
### The error may involve com.gary.system.modules.outbound.mapper.testObMapper.batchInserttestOb-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO kc_20230925 (ID, TYPE, STATUS, RESULT, ATTEMPT, DAILY_FROM, DAILY_TILL, TZ_ID, CHAIN_ID, CH_N, PHONE, TYPE, CONTACT_INFO, CONTACT_INFO_TYPE, DATA_01, SW_ID, CAM_ID, DATA_02, DATA_04) VALUES (?, 2, 1, 0, ?, ?, ?, 112, ?, 0, ?, 1, ?, 1, ?, 101, ?, ?, ?)
### Cause: java.sql.SQLSyntaxErrorException: Table 'gary_table.kc_20230925' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'gary_table.kc_20230925' doesn't exist
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
    at com.sun.proxy.$Proxy136.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at com.sun.proxy.$Proxy170.batchInserttestOb(Unknown Source)
    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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
    at com.gary.framework.aspectj.DataSourceAspect.around(DataSourceAspect.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

2.解决方案

数据源切换失败试了好几种办法都不行,后来看了一篇文章,介绍需要加入下面这一段

@Transactional(propagation = Propagation.REQUIRES_NEW)

结果还是真管用了,这样就需要自己控制事务了。 

3.其他办法

那还有没有其他方法呢,之前也遇到过没仔细研究过,直接使用了若依官方提供的如下的方法也可以解决。

DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());

下面是官方例子: 

public List<SysUser> selectUserList(SysUser user)
{
    //手动开启
	DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
	List<SysUser> userList = userMapper.selectUserList(user);
    //手动关闭
	DynamicDataSourceContextHolder.clearDataSourceType();
	return userList;
}

也可以通过上面这段代码也可以生效。

4.总结

参考官方文档为主,其他博主为辅,主要还是不断的尝试。 最后还要为若依这种开源系统大大的点赞。

Logo

快速构建 Web 应用程序

更多推荐