💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Spring Boot – 数据源配置 > 原文: [https://howtodoinjava.com/spring-boot2/datasource-configuration/](https://howtodoinjava.com/spring-boot2/datasource-configuration/) 了解什么是数据源以及如何在 Spring Boot 应用程序中创建和自定义`DataSource` bean。 ## 1\. 什么是数据源 数据源是用于连接任何物理数据源的工厂。 `DriverManager`工具的替代品。 它使用 URL 以及一些凭据来建立数据库连接。 实现[`javax.sql.DataSource`](https://docs.oracle.com/javase/10/docs/api/javax/sql/DataSource.html)接口的对象通常会在 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` ```java <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.2. `application.properties` `application.properties`文件中的外部配置属性(`spring.datasource.*`)提供了`DataSource`配置。 属性配置将配置与应用程序代码分离。 这样,我们甚至可以从配置提供程序系统中导入数据源配置。 下面给出的配置显示了 H2,MySQL,Oracle 和 SQL Server 数据库的示例属性。 > 我们通常不需要指定`driver-class-name`,因为 Spring Boot 可以从 url 推断出大多数数据库。 ```java # H2 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 ``` #### 2.3. `DataSource` Bean 推荐的创建`DataSource` bean 的方法是在带有`@Configuration`注解的类中使用`DataSourceBuilder`类。 数据源也使用基础连接池。 `JpaConfig.java` ```java @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(); } } ``` #### 2.4. JNDI 数据源 如果我们将 Spring Boot 应用程序部署到应用服务器,则可能需要使用应用服务器的内置功能来配置和管理`DataSource`,并使用 JNDI 对其进行访问。 我们可以使用`spring.datasource.jndi-name`属性来执行此操作。 例如 ```java #JBoss defined datasource using JNDI 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.*`)微调[实现特定的设置](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#data-properties)。 例如,我们可以使用以下属性来[定制 DBCP2 连接池](https://commons.apache.org/proper/commons-dbcp/configuration.html)。 ```java 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 ... ``` ## 4\. 使用 Spring Boot 的多个数据源 要配置多个数据源,请创建所需的任意多个 bean 定义,但将`DataSource`实例之一标记为`@Primary`,因为各种自动配置都希望能够按类型获取。 请记住,如果我们创建自己的数据源,则会取消自动配置。 因此,我们负责为所有数据源 bean 提供配置。 `JpaConfig.java` ```java @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`注解。 `Autowire primary datasource` ```java @Autowired DataSource dataSource; ``` `Autowire NON-primary datasource` ```java @Autowired @Qualifier("h2DataSource") DataSource dataSource; ``` ## 5\. 结论 Spring Boot 提供了非常简单的方法来创建数据源 bean – 使用属性配置或使用 java 配置`@Bean`。 Spring Boot 提供了现成的自动配置以供使用,可以通过`application.properties`文件中的高级选项进一步自定义。 Spring Boot 首先尝试查找和配置连接池,然后是 HikariCP,然后是 Tomcat 池,然后是 Commons DBCP2。 `HikariCP`内置有`spring-boot-starter-jdbc`或`spring-boot-starter-data-jpa`起动器。 我们可以配置多个数据源,并且其中之一必须标记为`@Primary`。 默认情况下,主数据源是自动装配的,其他数据源需要与`@Qualifier`注解一起自动装配。 学习愉快! [下载源码](https://github.com/lokeshgupta1981/SpringExamples/tree/master/rest-crud-hibernate)