資料來源配置
單資料來源
配置步驟
- 引入依賴:H2資料庫驅動、JDBC依賴、acturator(運維)、web模組(用於測試)、lambok(使用@Slf4j列印日誌)。
- 直接配置所需的Bean,注入容器。
- 資料來源:DataSource
- 事務:例PlatformTransactionManager(DataSourceTransactionManager)
- 操作:例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();
}
擴充套件
- 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。
-
排除了SpringBoot的資料來源自動配置,SpringBoot不會為你初始化Schema和Data。參考DataSourceInitializerInvoker設定初始化資料。
-
SpringBoot自動配置多數都是針對只有一個DataSource的情況,要麼給主要的DataSource Bean增加@Primary註解,要麼就把幾個自動配置類排除掉。
-
自動配置會針對上下文中唯一的DataSource或者標記了@Primary的那個DataSource做相關配置
其他,Spring中,AbstractRoutingDataSource,可以自動切換多個資料來源。通過編碼來指定DataSource。Alibaba Druid裡也有一個HA的DataSource,用ThreadLocal變數來控制返回哪個DataSource。
完全不同的庫,分開寫,不使用自動切。分庫分表或者讀寫分離的情況,用中介軟體來做,無論是客戶端的,還是代理的。