依赖

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  4. <version>3.4.0</version>
  5. </dependency>

原理

理解数据源切换的重心在于理解 sql 到底是 执行的,这个谁又是从哪里来的,抓住了这一点,就抓住了蛇的七寸。

这里的 javax.sql.Connection,而 Connection 的来源之一则是 DataSource ,事务也是依托于于 Connection 的。

只要能够获取到 Connection 就能执行 SQL , 但是一般不会直接去操作单个链接,于是面向 产生 ConnectionDataSource。 在运行到过程中不断的切换获取 ConnectionDataSource 来达成这个效果。 而切换的实现则是利用 AOP 进行切面处理。

但是 Connection 的直接来源还有 ThreadLocal, 所以在 dynamic-datasource-spring-boot-starter 中,直接使用 @Transactional, 不会产生数据源切换。

结论

抓住 Connection是执行 SQL 的重点,由于直接操控 Connection 的不便捷,转头去切换 DataSource