依赖
<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
。