SpringBoot資料來源相關配置

Awecoder發表於2021-11-19

資料來源配置

單資料來源

配置步驟

  1. 引入依賴:H2資料庫驅動、JDBC依賴、acturator(運維)、web模組(用於測試)、lambok(使用@Slf4j列印日誌)。
  2. 直接配置所需的Bean,注入容器。
    1. 資料來源:DataSource
    2. 事務:例PlatformTransactionManager(DataSourceTransactionManager)
    3. 操作:例JdbcTemplate

springboot所做的自動配置,包括上面三個,分別是DataSourceAutoConfiguration、DataSourceTransactionManagerAutoConfiguration、JdbcTemplateAutoConfiguration。

配置屬性

# Spring boot actuator端點暴露
management.endpoints.web.exposure.include=*
# 控制檯彩色輸出,不要帶到生產上去!!
spring.output.ansi.enabled=ALWAYS

# 通用屬性
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver(可選)

# 初始化內嵌資料庫
spring.datasource.initialization-mode=embedded|always|never
spring.datasource.schema與spring.datasource.data確定初始化SQL⽂檔案
spring.datasource.platform=hsqldb | h2 | oracle | mysql | postgresql(與前者對應)

多資料來源

配置多個資料來源有兩種方式,第一種是繼續使用springboot自動配置,通過@Primary設定主資料來源;第二種是剔除springboot自動配置,分別配置多個資料來源、事務管理器、JDBCTmeplate等。

@Bean
@Primary
@ConfigurationProperties("app.datasource.member")
public DataSourceProperties memberDataSourceProperties() {
    return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.datasource.member.configuration")
public DataSource memberDataSource() {
    return memberDataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();
}

擴充套件

  1. Spring自己會計算依賴關係,把依賴最底層的Bean先建立出來。

All @Configuration classes are subclassed at startup-time with CGLIB. In the subclass, the child method checks the container first for any cached (scoped) beans before it calls the parent method and creates a new instance.

所有@Configuration類在啟動時會使用CGLIB子類化。子類方法在呼叫父類方法或建立新例項之前,首先會檢查容器中是否有快取的bean。

  1. 排除了SpringBoot的資料來源自動配置,SpringBoot不會為你初始化Schema和Data。參考DataSourceInitializerInvoker設定初始化資料。

  2. SpringBoot自動配置多數都是針對只有一個DataSource的情況,要麼給主要的DataSource Bean增加@Primary註解,要麼就把幾個自動配置類排除掉。

  3. 自動配置會針對上下文中唯一的DataSource或者標記了@Primary的那個DataSource做相關配置

其他,Spring中,AbstractRoutingDataSource,可以自動切換多個資料來源。通過編碼來指定DataSource。Alibaba Druid裡也有一個HA的DataSource,用ThreadLocal變數來控制返回哪個DataSource。

完全不同的庫,分開寫,不使用自動切。分庫分表或者讀寫分離的情況,用中介軟體來做,無論是客戶端的,還是代理的。

相關文章