原文: https://howtodoinjava.com/spring-boot2/datasource-configuration/

了解什么是数据源以及如何在 Spring Boot 应用程序中创建和自定义DataSource bean。

1. 什么是数据源

数据源是用于连接任何物理数据源的工厂。 DriverManager工具的替代品。 它使用 URL 以及一些凭据来建立数据库连接。

实现javax.sql.DataSource接口的对象通常会在 JNDI 服务中注册,并且可以使用其 JNDI 名称进行发现。

数据源可用于获取:

  • 标准Connection对象
  • 可以在连接池中使用的连接
  • 可以在分布式事务和连接池中使用的连接

2. 数据源配置

Spring Boot 允许以两种方式定义数据源配置,即 Java 配置和属性配置。 DataSourceAutoConfiguration在为我们配置DataSource bean 之前,先在类路径上检查DataSource.class(或EmbeddedDatabaseType.class)。

2.1. Maven

如果尚未定义,请包含spring-boot-starter-data-jpa进行投影。 它带来了所有必要的依赖关系,包括用于各种数据库的 JDBC 驱动程序,例如mysql-connector-java用于连接到 mysql 。

如果我们计划在某个步骤(例如测试)使用嵌入式数据库,则可以单独导入 H2 db。

pom.xml

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.h2database</groupId>
  7. <artifactId>h2</artifactId>
  8. <version>2.4.1</version>
  9. <scope>runtime</scope>
  10. </dependency>

2.2. application.properties

application.properties文件中的外部配置属性(spring.datasource.*)提供了DataSource配置。

属性配置将配置与应用程序代码分离。 这样,我们甚至可以从配置提供程序系统中导入数据源配置。

下面给出的配置显示了 H2,MySQL,Oracle 和 SQL Server 数据库的示例属性。

我们通常不需要指定driver-class-name,因为 Spring Boot 可以从 url 推断出大多数数据库。

  1. # H2
  2. spring.datasource.url=jdbc:h2:file:C:/temp/test
  3. spring.datasource.username=sa
  4. spring.datasource.password=
  5. spring.datasource.driverClassName=org.h2.Driver
  6. spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  7. # MySQL
  8. #spring.datasource.url=jdbc:mysql://localhost:3306/test
  9. #spring.datasource.username=dbuser
  10. #spring.datasource.password=dbpass
  11. #spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  12. spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
  13. # Oracle
  14. #spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
  15. #spring.datasource.username=dbuser
  16. #spring.datasource.password=dbpass
  17. #spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
  18. #spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
  19. # SQL Server
  20. #spring.datasource.url=jdbc:sqlserver://localhost;databaseName=springbootdb
  21. #spring.datasource.username=dbuser
  22. #spring.datasource.password=dbpass
  23. #spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
  24. #spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect

2.3. DataSource Bean

推荐的创建DataSource bean 的方法是在带有@Configuration注解的类中使用DataSourceBuilder类。 数据源也使用基础连接池。

JpaConfig.java

  1. @Configuration
  2. public class JpaConfig {
  3. @Bean
  4. public DataSource getDataSource()
  5. {
  6. DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
  7. dataSourceBuilder.driverClassName("org.h2.Driver");
  8. dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
  9. dataSourceBuilder.username("sa");
  10. dataSourceBuilder.password("");
  11. return dataSourceBuilder.build();
  12. }
  13. }

2.4. JNDI 数据源

如果我们将 Spring Boot 应用程序部署到应用服务器,则可能需要使用应用服务器的内置功能来配置和管理DataSource,并使用 JNDI 对其进行访问。

我们可以使用spring.datasource.jndi-name属性来执行此操作。 例如

  1. #JBoss defined datasource using JNDI
  2. spring.datasource.jndi-name = java:jboss/datasources/testDB

3. 连接池

3.1. HikariCP,tomcat 池和公用 DBCP2

对于要创建的池数据源,Spring Boot 会验证有效的Driver类是否可用。 如果我们设置spring.datasource.driver-class-name属性,则该驱动程序类必须是可加载的。

自动配置首先尝试查找和配置HikariCP。 如果HikariCP可用,则始终选择它。 否则,如果找到 Tomcat 池,则对其进行配置。

如果 HikariCP 和 Tomcat 池数据源均不可用,并且 Commons DBCP2 不可用,则使用它。

spring-boot-starter-data-jpa起动器自动获得对HikariCP的依赖。

3.2. 自定义设置

还可以通过使用它们各自的前缀(spring.datasource.hikari.*spring.datasource.tomcat.*spring.datasource.dbcp2.*)微调实现特定的设置

例如,我们可以使用以下属性来定制 DBCP2 连接池

  1. spring.datasource.dbcp2.initial-size = 50
  2. spring.datasource.dbcp2.max-idle = 50
  3. spring.datasource.dbcp2.default-query-timeout = 10000
  4. spring.datasource.dbcp2.default-auto-commit = true
  5. ...

4. 使用 Spring Boot 的多个数据源

要配置多个数据源,请创建所需的任意多个 bean 定义,但将DataSource实例之一标记为@Primary,因为各种自动配置都希望能够按类型获取。

请记住,如果我们创建自己的数据源,则会取消自动配置。 因此,我们负责为所有数据源 bean 提供配置。

JpaConfig.java

  1. @Configuration
  2. public class JpaConfig {
  3. @Bean(name = "h2DataSource")
  4. public DataSource h2DataSource()
  5. {
  6. DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
  7. dataSourceBuilder.driverClassName("org.h2.Driver");
  8. dataSourceBuilder.url("jdbc:h2:file:C:/temp/test");
  9. dataSourceBuilder.username("sa");
  10. dataSourceBuilder.password("");
  11. return dataSourceBuilder.build();
  12. }
  13. @Bean(name = "mySqlDataSource")
  14. @Primary
  15. public DataSource mySqlDataSource()
  16. {
  17. DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
  18. dataSourceBuilder.url("jdbc:mysql://localhost/testdb");
  19. dataSourceBuilder.username("dbuser");
  20. dataSourceBuilder.password("dbpass");
  21. return dataSourceBuilder.build();
  22. }
  23. }

在自动装配数据源时,Spring Boot 将首选主数据源,即mySqlDataSource。 要自动装配另一个非主要数据源,请使用@Qualifier注解。

Autowire primary datasource

  1. @Autowired
  2. DataSource dataSource;

Autowire NON-primary datasource

  1. @Autowired
  2. @Qualifier("h2DataSource")
  3. DataSource dataSource;

5. 结论

Spring Boot 提供了非常简单的方法来创建数据源 bean – 使用属性配置或使用 java 配置@Bean。 Spring Boot 提供了现成的自动配置以供使用,可以通过application.properties文件中的高级选项进一步自定义。

Spring Boot 首先尝试查找和配置连接池,然后是 HikariCP,然后是 Tomcat 池,然后是 Commons DBCP2。 HikariCP内置有spring-boot-starter-jdbcspring-boot-starter-data-jpa起动器。

我们可以配置多个数据源,并且其中之一必须标记为@Primary。 默认情况下,主数据源是自动装配的,其他数据源需要与@Qualifier注解一起自动装配。

学习愉快!

下载源码