更新時間:2022-03-24 09:55:51 來源:動力節點 瀏覽1594次
很多朋友對Spring多數據源的配置不是很了解,下面小編就來給大家詳細介紹一下。
ADataSource是連接到物理數據庫的工廠。它是DriverManager工具的替代方案。數據源使用 URL 以及用戶名/密碼憑據來建立數據庫連接。
在 Java 中,數據源實現了javax.sql.DataSource接口。此數據源通常會在 JNDI 服務中注冊,并且可以使用其 JNDI 名稱來發現。
我們可以使用數據源來獲取:
標準Connection對象
可用于連接池的連接
可用于分布式事務和連接池的連接
Spring boot 允許以兩種方式定義數據源配置:
Java 配置
屬性配置
在應用程序啟動期間,在為我們配置DataSource bean之前DataSourceAutoConfiguration檢查類路徑上的DataSource.class(或EmbeddedDatabaseType.class )以及其他一些事情。
(1)Maven 依賴
如果尚未定義,請將spring-boot-starter-data-jpa包含到項目中。這種依賴帶來了所有必要的依賴,包括各種數據庫的 JDBC 驅動程序,例如mysql-connector-java連接到MySQL數據庫。
如果我們計劃在某個步驟(例如,測試)使用嵌入式數據庫,我們可以單獨導入H2 DB。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.4.1</version>
<scope>runtime</scope>
</dependency>
(2)屬性配置
DataSource配置由文件spring.datasource.*中的配置屬性條目 ( ) 提供application.properties。
屬性配置將配置與應用程序代碼分離。這樣,我們甚至可以從配置提供者系統中導入數據源配置。
下面給出的配置顯示了H2、MySQL、Oracle和SQL Server數據庫的示例屬性。
# H2 DB
spring.datasource.url=jdbc:h2:file:C:/temp/test
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# Oracle
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
# SQL Server
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=springbootdb
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
(3)Java 配置
創建DataSource bean 的推薦方法是在使用@Configuration注釋注釋的類中使用DataSourceBuilder類。
給出的是 H2 DB 的示例 bean。請根據需要配置其他 bean。
@Configuration
public class JpaConfig {
@Bean
public DataSource getDataSource()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
dataSourceBuilder.username("sa");
dataSourceBuilder.password("");
return dataSourceBuilder.build();
}
}
(4)JNDI 數據源
假設我們將 Spring Boot 應用程序部署到應用程序服務器。在這種情況下,我們可能希望使用 Application Server 的內置功能來配置和管理 DataSource,并使用 JNDI 訪問它。
我們可以使用spring.datasource.jndi-name屬性來做到這一點。
#JBoss defined datasource using JNDI
spring.datasource.jndi-name = java:jboss/datasources/testDB
(1)HikariCP、Tomcat 池和 Commons DBCP2
對于要創建的池數據源,Spring boot 會驗證有效的Driver類是否可用。如果我們設置spring.datasource.driver-class-name屬性,那么必須找到并加載提到的驅動程序類。
自動配置首先嘗試查找和配置HikariCP。如果 HikariCP 可用,它總是選擇它。
否則,如果找到Tomcat Pooling,則對其進行配置。
如果 HikariCP 和 Tomcat Pooling 數據源都不可用,并且Commons DBCP2可用,則使用它。
spring-boot-starter-data-jpastarter 自動獲得對HikariCP.
(2)自定義連接池默認值
還可以通過使用它們各自的前綴(、和)來微調特定于實現的設置。spring.datasource.hikari.*spring.datasource.tomcat.*spring.datasource.dbcp2.*
例如,我們可以使用以下屬性來自定義 DBCP2 連接池。
spring.datasource.dbcp2.initial-size = 50
spring.datasource.dbcp2.max-idle = 50
spring.datasource.dbcp2.default-query-timeout = 10000
spring.datasource.dbcp2.default-auto-commit = true
要配置多個數據源,請根據需要創建任意數量的 bean 定義,但將其中一個DataSource實例標記為@Primary。
請記住,如果我們創建自己的數據源,自動配置就會退出。在這種情況下,我們負責為所有數據源 bean 提供配置。
@Configuration
public class JpaConfig {
@Bean(name = "h2DataSource")
public DataSource h2DataSource()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
dataSourceBuilder.username("sa");
dataSourceBuilder.password("");
return dataSourceBuilder.build();
}
@Bean(name = "mySqlDataSource")
@Primary
public DataSource mySqlDataSource()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:mysql://localhost/testdb");
dataSourceBuilder.username("dbuser");
dataSourceBuilder.password("dbpass");
return dataSourceBuilder.build();
}
}
在自動裝配數據源時,spring boot 將首選主數據源,即“mySqlDataSource”。要自動裝配另一個非主數據源,請使用@Qualifier注釋。
自動裝配主數據源
@Autowired
DataSource dataSource;
Autowire 非主數據源
@Autowired
@Qualifier("h2DataSource")
DataSource dataSource;
Spring boot 提供了創建數據源 bean 的直接方法——使用屬性配置或使用 java 配置。Spring Boot 提供現成的自動配置以供使用,可以使用application.properties文件中的高級選項進一步定制。
Spring boot 嘗試查找和配置連接池,首先是 HikariCP,其次是 Tomcat 池,最后是 Commons DBCP2。HikariCP內置spring-boot-starter-jdbc或spring-boot-starter-data-jpa啟動器。
我們可以配置多個數據源,我們必須標記為其中之一@Primary。默認情況下,主數據源是自動裝配的,其他數據源需要與@Qualifier注釋一起自動裝配。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習