依赖
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.0</version></dependency>
原理
理解数据源切换的重心在于理解 sql 到底是 谁 执行的,这个谁又是从哪里来的,抓住了这一点,就抓住了蛇的七寸。
这里的 谁 是 javax.sql.Connection,而 Connection 的来源之一则是 DataSource ,事务也是依托于于 Connection 的。
只要能够获取到 Connection 就能执行 SQL , 但是一般不会直接去操作单个链接,于是面向 产生 Connection 的 DataSource。 在运行到过程中不断的切换获取 Connection 的 DataSource 来达成这个效果。 而切换的实现则是利用 AOP 进行切面处理。
但是 Connection 的直接来源还有 ThreadLocal, 所以在 dynamic-datasource-spring-boot-starter 中,直接使用 @Transactional, 不会产生数据源切换。
结论
抓住 Connection是执行 SQL 的重点,由于直接操控 Connection 的不便捷,转头去切换 DataSource。
