SpringBoot多数据源切换 多数据源事务解决方案 二
https://zhuanlan.zhihu.com/p/612825647?utm_id=0
https://blog.csdn.net/guzhangyu12345/article/details/108559810
SpringBoot多数据源事务解决方案
https://blog.csdn.net/u013407099/article/details/124526396多数据源切换下保证事务解决方案
https://blog.csdn.net/reee112/article/details/90442542
概述
在大型项目开发中,当数据量达到一定程度后,我们一般采用分库分表来实现数据层的拓展,面对复杂的存储层,相应的数据库中间件和多数据源切换的需求就应运而生。
这里我们重点讨论下多数据源切换,多数据源的动态切换可以方便我们快速的实现主从读写分离、异构纯粹多库等动态数据库操作。
常见的多数据源一般有以下两种解决方案:
1、通过显示模式声明多数据源,应用切换。优点是简单,缺点是不易于拓展,强耦合。
2、通过优先代理类实现动态切换,Spring的AbstractRoutingDataSource就是采用这种架构。
可以基于dynamic-datasource-spring-boot-starter实现动态多数据源切换。
前情提要
多数据源切换流程结构图如下所示,包含几个组成元素:
自定义的数据源配置处理,通过DataSource对象动态注册到系统中
自定义数据源标识注解与切面
数据源切换时的上下文线程变量持有者
自定义AbstractRoutingDataSource,实现数据源路由切换
事务
如果只是重写了AbstractRoutingDataSource方法,那么在事务下数据源是切换不了的,还需要重写事务方法。
Spring使用事务的方式有两种,一种是声明式事务,一种是编程式事务,我们讨论的都是关于声明式事务,这种方式很方便,也是大家常用的,这里为什么讨论这个问题,当我们想将不同库的表放在同一个事务使用的时候会报错。
我们要做就是动态的根据DataSourceType获取不同的Connection,不从缓存中获取Connection。
在Spring事务管理中有一个核心类DataSourceTransactionManager,该类是Spring事务核心的默认实现,AbstractPlatformTransactionManager是整体的Spring事务实现模板类,整体的继承结构如下图。

Mybatis
@DataSourceCurrent("master")
@Mapper
public interface Order1Mapper extends BaseMapper<Order1> {}@DataSourceCurrent("second")
@Mapper
public interface Order2Mapper extends BaseMapper<Order2> {}
公共方法标记@Transactional
@Service
public class OrderServiceImpl implements OrderService {@Resourceprivate Order1Service order1Service;@Resourceprivate Order2Service order2Service;@Transactional@Overridepublic void saveOrders2(){order1Service.updateOrderById();order2Service.updateOrderById(); //set exception, rollback all}
Main方法 @Import
@Import(DynamicDataSourceRegistrar.class)
@SpringBootApplication
public class DataSourceApplication22 {public static void main(String[] args) { SpringApplication.run(DataSourceApplication22.class, args); }
}
执行结果,回滚日志
D:\Java\jdk1.8.0_251\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=51331:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_251\jre\lib\charsets.jar;D:\Java\jdk1.8.0_251\jre\lib\deploy.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_251\jre\lib\javaws.jar;D:\Java\jdk1.8.0_251\jre\lib\jce.jar;D:\Java\jdk1.8.0_251\jre\lib\jfr.jar;D:\Java\jdk1.8.0_251\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_251\jre\lib\jsse.jar;D:\Java\jdk1.8.0_251\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_251\jre\lib\plugin.jar;D:\Java\jdk1.8.0_251\jre\lib\resources.jar;D:\Java\jdk1.8.0_251\jre\lib\rt.jar;D:\IdeaProjects\test-datasource22\target\classes;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.6.3\spring-boot-starter-web-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter\2.6.3\spring-boot-starter-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot\2.6.3\spring-boot-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.6.3\spring-boot-starter-logging-2.6.3.jar;C:\Users\LENOVO\.m2\repository\ch\qos\logback\logback-classic\1.2.10\logback-classic-1.2.10.jar;C:\Users\LENOVO\.m2\repository\ch\qos\logback\logback-core\1.2.10\logback-core-1.2.10.jar;C:\Users\LENOVO\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.1\log4j-to-slf4j-2.17.1.jar;C:\Users\LENOVO\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.1\log4j-api-2.17.1.jar;C:\Users\LENOVO\.m2\repository\org\slf4j\jul-to-slf4j\1.7.33\jul-to-slf4j-1.7.33.jar;C:\Users\LENOVO\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-core\5.3.15\spring-core-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-jcl\5.3.15\spring-jcl-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.6.3\spring-boot-starter-json-2.6.3.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.1\jackson-databind-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.1\jackson-annotations-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.1\jackson-core-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.1\jackson-datatype-jdk8-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.1\jackson-datatype-jsr310-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.1\jackson-module-parameter-names-2.13.1.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.3\spring-boot-starter-tomcat-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.56\tomcat-embed-core-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.56\tomcat-embed-el-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.56\tomcat-embed-websocket-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-web\5.3.15\spring-web-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-beans\5.3.15\spring-beans-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-webmvc\5.3.15\spring-webmvc-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-context\5.3.15\spring-context-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-expression\5.3.15\spring-expression-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.6.3\spring-boot-starter-aop-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-aop\5.3.15\spring-aop-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.3.2\mybatis-plus-boot-starter-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus\3.3.2\mybatis-plus-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-extension\3.3.2\mybatis-plus-extension-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-core\3.3.2\mybatis-plus-core-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-annotation\3.3.2\mybatis-plus-annotation-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\github\jsqlparser\jsqlparser\3.1\jsqlparser-3.1.jar;C:\Users\LENOVO\.m2\repository\org\mybatis\mybatis\3.5.4\mybatis-3.5.4.jar;C:\Users\LENOVO\.m2\repository\org\mybatis\mybatis-spring\2.0.4\mybatis-spring-2.0.4.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.3\spring-boot-autoconfigure-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.6.3\spring-boot-starter-jdbc-2.6.3.jar;C:\Users\LENOVO\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;C:\Users\LENOVO\.m2\repository\org\slf4j\slf4j-api\1.7.33\slf4j-api-1.7.33.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-jdbc\5.3.15\spring-jdbc-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-tx\5.3.15\spring-tx-5.3.15.jar;C:\Users\LENOVO\.m2\repository\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar;C:\Users\LENOVO\.m2\repository\com\alibaba\fastjson\1.2.83\fastjson-1.2.83.jar;C:\Users\LENOVO\.m2\repository\org\projectlombok\lombok\1.18.22\lombok-1.18.22.jar com.java.DataSourceApplication22. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.6.3)2024-03-10 17:41:56.342 INFO 30476 --- [ main] com.java.DataSourceApplication22 : Starting DataSourceApplication22 using Java 1.8.0_251 on DESKTOP-GCE7E0L with PID 30476 (D:\IdeaProjects\test-datasource22\target\classes started by LENOVO in D:\IdeaProjects\test-datasource22)
2024-03-10 17:41:56.346 INFO 30476 --- [ main] com.java.DataSourceApplication22 : The following profiles are active: test
2024-03-10 17:41:56.759 INFO 30476 --- [ main] c.j.config.DynamicDataSourceRegistrar : 开始注册数据源 evn
2024-03-10 17:41:57.236 INFO 30476 --- [ main] c.j.config.DynamicDataSourceRegistrar : register, bind ds: master, second ---- registerBeanDefinitions()
2024-03-10 17:41:57.246 INFO 30476 --- [ main] com.zaxxer.hikari.HikariDataSource : master - Starting...
2024-03-10 17:41:57.437 INFO 30476 --- [ main] com.zaxxer.hikari.HikariDataSource : master - Start completed.
2024-03-10 17:41:57.442 INFO 30476 --- [ main] c.j.config.DynamicDataSourceRegistrar : ==================注册数据源master成功
2024-03-10 17:41:57.442 INFO 30476 --- [ main] com.zaxxer.hikari.HikariDataSource : second - Starting...
2024-03-10 17:41:57.454 INFO 30476 --- [ main] com.zaxxer.hikari.HikariDataSource : second - Start completed.
2024-03-10 17:41:57.454 INFO 30476 --- [ main] c.j.config.DynamicDataSourceRegistrar : ==========注册数据源second成功
2024-03-10 17:41:57.457 INFO 30476 --- [ main] c.j.config.DynamicDataSourceRegistrar : 注册数据源成功,一共注册2个数据源
2024-03-10 17:41:58.781 INFO 30476 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8099 (http)
2024-03-10 17:41:58.792 INFO 30476 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-03-10 17:41:58.793 INFO 30476 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2024-03-10 17:41:58.951 INFO 30476 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-03-10 17:41:58.951 INFO 30476 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2522 ms
dynamic ds classpath:mapper/*.xml_ _ |_ _ _|_. ___ _ | _
| | |\/|_)(_| | |_\ |_)||_|_\ / | 3.3.2
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
2024-03-10 17:42:01.556 INFO 30476 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8099 (http) with context path ''
2024-03-10 17:42:01.570 INFO 30476 --- [ main] com.java.DataSourceApplication22 : Started DataSourceApplication22 in 6.208 seconds (JVM running for 8.211)
2024-03-10 17:42:22.205 INFO 30476 --- [nio-8099-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-10 17:42:22.205 INFO 30476 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-03-10 17:42:22.207 INFO 30476 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
2024-03-10 17:42:22.260 INFO 30476 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-03-10 17:42:22.272 INFO 30476 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-03-10 17:42:22.292 INFO 30476 --- [nio-8099-exec-1] com.java.service.OrderServiceImpl : update start......
2024-03-10 17:42:22.308 INFO 30476 --- [nio-8099-exec-1] com.java.service.Order1ServiceImpl : update order1 start...
2024-03-10 17:42:22.320 INFO 30476 --- [nio-8099-exec-1] com.java.config.DsMapperAspect1 : MapperAspect set 数据源: master
2024-03-10 17:42:22.321 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, set ds key:master
Creating a new SqlSession
================init MultiDataSourceTransaction Factory================
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022]
2024-03-10 17:42:22.404 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:master
2024-03-10 17:42:22.405 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds map, dsName:master
2024-03-10 17:42:22.405 INFO 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, get conn, ThreadLocal----null
2024-03-10 17:42:22.405 ERROR 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds get conn, ds key null, 没开事务
2024-03-10 17:42:22.405 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:master
2024-03-10 17:42:22.405 INFO 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, determineCurrentLookupKey 当前数据源: master
2024-03-10 17:42:22.406 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds, conn: HikariProxyConnection@198635215 wrapping com.mysql.cj.jdbc.ConnectionImpl@49b6b5eb
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022]
2024-03-10 17:42:22.464 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, rm key:master
2024-03-10 17:42:22.465 INFO 30476 --- [nio-8099-exec-1] com.java.service.Order1ServiceImpl : ---update order1 OK, result:1
2024-03-10 17:42:22.466 INFO 30476 --- [nio-8099-exec-1] com.java.service.OrderServiceImpl : ======================================
2024-03-10 17:42:22.479 INFO 30476 --- [nio-8099-exec-1] com.java.service.Order2ServiceImpl : ---update order2 start...
2024-03-10 17:42:22.481 INFO 30476 --- [nio-8099-exec-1] com.java.config.DsMapperAspect1 : MapperAspect set 数据源: second
2024-03-10 17:42:22.481 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, set ds key:second
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022] from current transaction
2024-03-10 17:42:22.483 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:second
2024-03-10 17:42:22.483 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds map, dsName:second
2024-03-10 17:42:22.483 INFO 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, get conn, ThreadLocal----null
2024-03-10 17:42:22.483 ERROR 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds get conn, ds key null, 没开事务
2024-03-10 17:42:22.483 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:second
2024-03-10 17:42:22.483 INFO 30476 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, determineCurrentLookupKey 当前数据源: second
2024-03-10 17:42:22.484 INFO 30476 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
2024-03-10 17:42:22.493 INFO 30476 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2024-03-10 17:42:22.494 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds, conn: HikariProxyConnection@21529602 wrapping com.mysql.cj.jdbc.ConnectionImpl@16746d16
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022]
2024-03-10 17:42:22.499 INFO 30476 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, rm key:second
2024-03-10 17:42:22.500 INFO 30476 --- [nio-8099-exec-1] com.java.service.Order2ServiceImpl : ---update order2 OK, result:1
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2eaf1022]
2024-03-10 17:42:22.502 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, do rollback
2024-03-10 17:42:22.515 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, do rollback
2024-03-10 17:42:22.520 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, connection close
2024-03-10 17:42:22.527 INFO 30476 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, connection close
2024-03-10 17:42:22.555 ERROR 30476 --- [nio-8099-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: order2 exception] with root causejava.lang.RuntimeException: order2 exceptionat com.java.service.Order2ServiceImpl.updateOrderById(Order2ServiceImpl.java:33) ~[classes/:na]at com.java.service.Order2ServiceImpl$$FastClassBySpringCGLIB$$31f65359.invoke(<generated>) ~[classes/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.15.jar:5.3.15]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) ~[spring-aop-5.3.15.jar:5.3.15]at com.java.service.Order2ServiceImpl$$EnhancerBySpringCGLIB$$abbb8a2e.updateOrderById(<generated>) ~[classes/:na]at com.java.service.OrderServiceImpl.saveOrders2(OrderServiceImpl.java:62) ~[classes/:na]at com.java.service.OrderServiceImpl$$FastClassBySpringCGLIB$$f72571f.invoke(<generated>) ~[classes/:na]at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.15.jar:5.3.15]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.15.jar:5.3.15]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.15.jar:5.3.15]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar:5.3.15]at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.15.jar:5.3.15]at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.15.jar:5.3.15]at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.15.jar:5.3.15]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.15.jar:5.3.15]at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar:5.3.15]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.15.jar:5.3.15]at com.java.service.OrderServiceImpl$$EnhancerBySpringCGLIB$$8e952140.saveOrders2(<generated>) ~[classes/:na]at com.java.controller.OrderController.saveOrder2(OrderController.java:34) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_251]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_251]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_251]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_251]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.15.jar:5.3.15]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.15.jar:5.3.15]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.15.jar:5.3.15]at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.15.jar:5.3.15]at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.56.jar:4.0.FR]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.15.jar:5.3.15]at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar:4.0.FR]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.15.jar:5.3.15]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.15.jar:5.3.15]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.15.jar:5.3.15]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar:5.3.15]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.56.jar:9.0.56]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.56.jar:9.0.56]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
执行成功日志
D:\Java\jdk1.8.0_251\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=51430:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_251\jre\lib\charsets.jar;D:\Java\jdk1.8.0_251\jre\lib\deploy.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_251\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_251\jre\lib\javaws.jar;D:\Java\jdk1.8.0_251\jre\lib\jce.jar;D:\Java\jdk1.8.0_251\jre\lib\jfr.jar;D:\Java\jdk1.8.0_251\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_251\jre\lib\jsse.jar;D:\Java\jdk1.8.0_251\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_251\jre\lib\plugin.jar;D:\Java\jdk1.8.0_251\jre\lib\resources.jar;D:\Java\jdk1.8.0_251\jre\lib\rt.jar;D:\IdeaProjects\test-datasource22\target\classes;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.6.3\spring-boot-starter-web-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter\2.6.3\spring-boot-starter-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot\2.6.3\spring-boot-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.6.3\spring-boot-starter-logging-2.6.3.jar;C:\Users\LENOVO\.m2\repository\ch\qos\logback\logback-classic\1.2.10\logback-classic-1.2.10.jar;C:\Users\LENOVO\.m2\repository\ch\qos\logback\logback-core\1.2.10\logback-core-1.2.10.jar;C:\Users\LENOVO\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.1\log4j-to-slf4j-2.17.1.jar;C:\Users\LENOVO\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.1\log4j-api-2.17.1.jar;C:\Users\LENOVO\.m2\repository\org\slf4j\jul-to-slf4j\1.7.33\jul-to-slf4j-1.7.33.jar;C:\Users\LENOVO\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-core\5.3.15\spring-core-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-jcl\5.3.15\spring-jcl-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.6.3\spring-boot-starter-json-2.6.3.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.1\jackson-databind-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.1\jackson-annotations-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.1\jackson-core-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.1\jackson-datatype-jdk8-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.1\jackson-datatype-jsr310-2.13.1.jar;C:\Users\LENOVO\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.1\jackson-module-parameter-names-2.13.1.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.3\spring-boot-starter-tomcat-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.56\tomcat-embed-core-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.56\tomcat-embed-el-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.56\tomcat-embed-websocket-9.0.56.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-web\5.3.15\spring-web-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-beans\5.3.15\spring-beans-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-webmvc\5.3.15\spring-webmvc-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-context\5.3.15\spring-context-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-expression\5.3.15\spring-expression-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.6.3\spring-boot-starter-aop-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-aop\5.3.15\spring-aop-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.3.2\mybatis-plus-boot-starter-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus\3.3.2\mybatis-plus-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-extension\3.3.2\mybatis-plus-extension-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-core\3.3.2\mybatis-plus-core-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\baomidou\mybatis-plus-annotation\3.3.2\mybatis-plus-annotation-3.3.2.jar;C:\Users\LENOVO\.m2\repository\com\github\jsqlparser\jsqlparser\3.1\jsqlparser-3.1.jar;C:\Users\LENOVO\.m2\repository\org\mybatis\mybatis\3.5.4\mybatis-3.5.4.jar;C:\Users\LENOVO\.m2\repository\org\mybatis\mybatis-spring\2.0.4\mybatis-spring-2.0.4.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.3\spring-boot-autoconfigure-2.6.3.jar;C:\Users\LENOVO\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.6.3\spring-boot-starter-jdbc-2.6.3.jar;C:\Users\LENOVO\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;C:\Users\LENOVO\.m2\repository\org\slf4j\slf4j-api\1.7.33\slf4j-api-1.7.33.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-jdbc\5.3.15\spring-jdbc-5.3.15.jar;C:\Users\LENOVO\.m2\repository\org\springframework\spring-tx\5.3.15\spring-tx-5.3.15.jar;C:\Users\LENOVO\.m2\repository\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar;C:\Users\LENOVO\.m2\repository\com\alibaba\fastjson\1.2.83\fastjson-1.2.83.jar;C:\Users\LENOVO\.m2\repository\org\projectlombok\lombok\1.18.22\lombok-1.18.22.jar com.java.DataSourceApplication22. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.6.3)2024-03-10 17:42:54.409 INFO 21316 --- [ main] com.java.DataSourceApplication22 : Starting DataSourceApplication22 using Java 1.8.0_251 on DESKTOP-GCE7E0L with PID 21316 (D:\IdeaProjects\test-datasource22\target\classes started by LENOVO in D:\IdeaProjects\test-datasource22)
2024-03-10 17:42:54.416 INFO 21316 --- [ main] com.java.DataSourceApplication22 : The following profiles are active: test
2024-03-10 17:42:55.127 INFO 21316 --- [ main] c.j.config.DynamicDataSourceRegistrar : 开始注册数据源 evn
2024-03-10 17:42:56.095 INFO 21316 --- [ main] c.j.config.DynamicDataSourceRegistrar : register, bind ds: master, second ---- registerBeanDefinitions()
2024-03-10 17:42:56.109 INFO 21316 --- [ main] com.zaxxer.hikari.HikariDataSource : master - Starting...
2024-03-10 17:42:56.512 INFO 21316 --- [ main] com.zaxxer.hikari.HikariDataSource : master - Start completed.
2024-03-10 17:42:56.518 INFO 21316 --- [ main] c.j.config.DynamicDataSourceRegistrar : ==================注册数据源master成功
2024-03-10 17:42:56.519 INFO 21316 --- [ main] com.zaxxer.hikari.HikariDataSource : second - Starting...
2024-03-10 17:42:56.538 INFO 21316 --- [ main] com.zaxxer.hikari.HikariDataSource : second - Start completed.
2024-03-10 17:42:56.538 INFO 21316 --- [ main] c.j.config.DynamicDataSourceRegistrar : ==========注册数据源second成功
2024-03-10 17:42:56.543 INFO 21316 --- [ main] c.j.config.DynamicDataSourceRegistrar : 注册数据源成功,一共注册2个数据源
2024-03-10 17:42:58.425 INFO 21316 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8099 (http)
2024-03-10 17:42:58.445 INFO 21316 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-03-10 17:42:58.446 INFO 21316 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2024-03-10 17:42:58.664 INFO 21316 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-03-10 17:42:58.664 INFO 21316 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4109 ms
dynamic ds classpath:mapper/*.xml_ _ |_ _ _|_. ___ _ | _
| | |\/|_)(_| | |_\ |_)||_|_\ / | 3.3.2
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
2024-03-10 17:43:01.646 INFO 21316 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8099 (http) with context path ''
2024-03-10 17:43:01.666 INFO 21316 --- [ main] com.java.DataSourceApplication22 : Started DataSourceApplication22 in 8.584 seconds (JVM running for 11.011)
2024-03-10 17:45:11.727 INFO 21316 --- [nio-8099-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-10 17:45:11.727 INFO 21316 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2024-03-10 17:45:11.730 INFO 21316 --- [nio-8099-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
2024-03-10 17:45:11.781 INFO 21316 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-03-10 17:45:11.789 INFO 21316 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-03-10 17:45:11.805 INFO 21316 --- [nio-8099-exec-1] com.java.service.OrderServiceImpl : update start......
2024-03-10 17:45:11.820 INFO 21316 --- [nio-8099-exec-1] com.java.service.Order1ServiceImpl : update order1 start...
2024-03-10 17:45:11.831 INFO 21316 --- [nio-8099-exec-1] com.java.config.DsMapperAspect1 : MapperAspect set 数据源: master
2024-03-10 17:45:11.833 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, set ds key:master
Creating a new SqlSession
================init MultiDataSourceTransaction Factory================
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
2024-03-10 17:45:11.905 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:master
2024-03-10 17:45:11.905 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds map, dsName:master
2024-03-10 17:45:11.905 INFO 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, get conn, ThreadLocal----null
2024-03-10 17:45:11.905 ERROR 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds get conn, ds key null, 没开事务
2024-03-10 17:45:11.906 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:master
2024-03-10 17:45:11.906 INFO 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, determineCurrentLookupKey 当前数据源: master
2024-03-10 17:45:11.906 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds, conn: HikariProxyConnection@1000277724 wrapping com.mysql.cj.jdbc.ConnectionImpl@4bc1686c
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
2024-03-10 17:45:11.963 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, rm key:master
2024-03-10 17:45:11.963 INFO 21316 --- [nio-8099-exec-1] com.java.service.Order1ServiceImpl : ---update order1 OK, result:1
2024-03-10 17:45:11.963 INFO 21316 --- [nio-8099-exec-1] com.java.service.OrderServiceImpl : ======================================
2024-03-10 17:45:11.977 INFO 21316 --- [nio-8099-exec-1] com.java.service.Order2ServiceImpl : ---update order2 start...
2024-03-10 17:45:11.978 INFO 21316 --- [nio-8099-exec-1] com.java.config.DsMapperAspect1 : MapperAspect set 数据源: second
2024-03-10 17:45:11.978 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, set ds key:second
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f] from current transaction
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:second
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds map, dsName:second
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, get conn, ThreadLocal----null
2024-03-10 17:45:11.980 ERROR 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds get conn, ds key null, 没开事务
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, get ds key:second
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] com.java.config.DynamicDataSourceRt : ds, determineCurrentLookupKey 当前数据源: second
2024-03-10 17:45:11.980 INFO 21316 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting...
2024-03-10 17:45:11.995 INFO 21316 --- [nio-8099-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2024-03-10 17:45:11.995 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, getConn from ds, conn: HikariProxyConnection@2121567456 wrapping com.mysql.cj.jdbc.ConnectionImpl@76efda58
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
2024-03-10 17:45:11.999 INFO 21316 --- [nio-8099-exec-1] com.java.config.DataSourceContextHolder : context, rm key:second
2024-03-10 17:45:12.000 INFO 21316 --- [nio-8099-exec-1] com.java.service.Order2ServiceImpl : ---update order2 OK, result:1
2024-03-10 17:45:12.000 INFO 21316 --- [nio-8099-exec-1] com.java.service.OrderServiceImpl : update order1 order2, END......
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
2024-03-10 17:45:12.001 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, commit ----- autoCommit: false
2024-03-10 17:45:12.004 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, commit ----- autoCommit: false
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@28025c1f]
2024-03-10 17:45:12.012 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, connection close
2024-03-10 17:45:12.020 INFO 21316 --- [nio-8099-exec-1] c.j.config.MultiDataSourceTransaction : trans, connection close相关文章:
SpringBoot多数据源切换 多数据源事务解决方案 二
https://zhuanlan.zhihu.com/p/612825647?utm_id0 https://blog.csdn.net/guzhangyu12345/article/details/108559810 SpringBoot多数据源事务解决方案 https://blog.csdn.net/u013407099/article/details/124526396多数据源切换下保证事务解决方案 https://blog.csdn.net/re…...
ElasticSearch 搜索推荐
Term Suggester "suggest_mode":"missing" missing 默认选项,不返回精准匹配到的分词结果 "suggest_mode":"popular" popular 大于等于搜索词频率的返回 "suggest_mode":"always", 不做任何限制&qu…...
Linux纯命令行查看文本文件
处理超大文本文件时,你可能希望避免一次性加载整个文件,这可能会耗尽内存资源。以下是一些在命令行中查看大文本文件的方法,它们适用于Linux和Unix系统,包括Mac OS X,而在Windows中,你可以使用类似的工具或…...
解决前端项目中Node.js版本不一致导致的依赖安装错误
解决前端项目中Node.js版本不一致导致的依赖安装错误 🌟 前言 欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。📚 🛠️ 技能清单 编程语言:Java、C、C、Python、Go、前端技术:Jquery、Vue…...
IIoT 与 IoT 之间的区别
物联网世界充满了各式各样的首字母缩写词,从LPWAN到MQTT,再到广为人知的IoT。然而,这仅仅是冰山一角,物联网领域还有更多的变化等待我们去探索,其中就包括IIoT,即工业物联网。那么,你可能会问&a…...
spring boot3token拦截器链的设计与实现
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截…...
LeetCode543题:二叉树的直径(python3)
代码思路: 先递归调用左儿子和右儿子求得它们为根的子树的深度 L和 R ,则该节点为根的子树的深度即为max(L,R)1。该节点的 dnode值为LR1 递归搜索每个节点并设一个全局变量 ans记录 dnode的最大值,最后返回 ans-1 即为树的直径。 # Definit…...
zabbix 7.0编译部署教程
zabbix 7.0编译部署教程 2024-03-08 16:50乐维社区 zabbix7.0 alpha版本、beta版本已经陆续发布,Zabbix7.0 LTS版本发布时间也越来越近。据了解,新的版本在性能提升、架构优化等新功能方面有非常亮眼的表现,不少小伙伴对此也已经跃跃欲试。心…...
Oracle Linux 8.9 安装 Python 3.11.8 和 Miniconda
Oracle Linux 8.9 安装 Python 3.11.8 和 Miniconda 1. 安装 Python 3.11.82. 安装 Miniconda 1. 安装 Python 3.11.8 Update system, sudo dnf update -yInstall Library, sudo dnf install curl gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make git -yI…...
Docker 配置阿里云镜像加速器
一、首先需要创建一个阿里云账号 二、登录阿里云账号 三、进入控制台 四、搜索容器镜像服务,并选择 五、选择镜像工具中的镜像加速 六 、配置镜像源 注意:有/etc/docker文件夹的直接从第二个命令开始...
[Linux][CentOs][Mysql]基于Linux-CentOs7.9系统安装并配置开机自启Mysql-8.0.28数据库
目录 一、准备工作:获取安装包和相应工具 (一)所需安装包 (二)安装包下载链接 (三)在服务器上创建文件夹并上传安装包 二、安装MySql (一)删除系统自带的mariadb …...
实用指南!2024年度计划怎么写?工作学习必备!
在新的一年开始之际,制定一份详细而实用的年度计划对于实现个人和职业目标至关重要。无论是在工作、学习还是生活中,一个明确的计划可以帮助你更好地组织时间、资源和精力,从而更有效地实现目标。下面是一个关于如何写年度计划的指南…...
js的事件有哪些?
鼠标事件: 鼠标事件 触发条件 onclick 鼠标点击左键触发 oncontextmenu 鼠标点击右键触发 ondblclick 鼠标双击触发 onmouseover 鼠标经过触发 onmouseout 鼠标离开触发 onmousemove 鼠标移动触发 onmouseup 鼠标弹起触发 onmousedown 鼠标按下触发 键盘事…...
Mock.js 基本语法与应用笔记
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
vue从零到一创建项目?
创建一个Vue项目通常需要经过以下步骤,从零开始构建一个基本的Vue项目: 步骤一:安装Node.js和npm 下载安装Node.js: 在Node.js官网下载适合你操作系统的Node.js安装包,并按照提示进行安装。安装完Node.js后ÿ…...
安装PyTorch详细过程
安装anaconda 登录anaconda的官网下载,anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 跳转到这个页面如果你的Python版本正好是3.8版,那便可以直接根据系统去选择自己相应的下载版本就可以了。 但是如果你的Python版本号不是当前页面…...
使用Rust开发小型搜索引擎
一、概述 用Rust创建搜索引擎是探索该语言在性能和安全性方面具有优势的绝佳方式。 这个项目将索引和搜索概念转移到Rust的生态系统中,由于Rust独特的语法和范式,这是一个挑战,但也是有益的。 二、构建搜索引擎 步骤1,创建项目…...
2024.3.13
1.顺序表去重 代码: //顺序表去重 void dele(seq_p L) {if(LNULL){printf("入参为空,请检查\n");return;}for(int i0;i<L->len-1;i){for(int ji1;j<L->len;j){if(L->data[i]L->data[j]){dele_data(L,L->data[j]);j--;}…...
schedule() , schedule_work() 以及schedule_timeout_interruptible()区别
schedule() 和 schedule_work() 是 Linux 内核中用于任务调度的两个函数,它们的作用和使用场景有所不同。 schedule() 函数: * 作用:将当前任务放入睡眠状态并调度其他可运行任务的函数。当调用 schedule() 时,当前任务会放弃 CPU…...
AWS入门实践-AWS CLI工具的使用介绍
AWS CLI(Amazon Web Services Command Line Interface)是一个强大的工具,它允许您直接从命令行与AWS服务进行交互。这不仅可以加快许多任务的处理速度,而且还可以通过脚本自动化。 一、AWS CLI工具的安装 1、Windows 安装下载…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
