29.1 Configuration a DataSource

Java的javax.sql.DataSource接口为数据库连接提供了一个标准方法.传统做法,一个“数据源”使用一个URL以及一些其他授权来建立一个数据库连接.

Tip

请参见How-to章节获取更多高级的例子,这些例子通常采取完全控制数据源的配置.

Embedded Database Support

使用内存数据库开发应用程序通常很方便.显然,内存数据库不提供持久存储.你需要在应用程序启动时装载数据库且在应用程序结束时销毁数据.

Tip

“指南”部分包含如何初始化数据库章节.

Spring Boot可以自动配置嵌入式H2HSQLDerby数据库.你不需要提供任何连接url.你只需要包括想要使用的嵌入式数据库依赖项即可.

Note

如果你想在测试环境中使用此功能,您可能会注意到,无论您使用多少个应用程序上下文,整个测试套件都重复使用相同的数据库. 如果你想确保每个上下文都有一个独立的嵌入式数据库,你应该设置spring.datasource.generate-unique-name属性为true.

例如,典型的POM依赖项如下:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.hsqldb</groupId>
  7. <artifactId>hsqldb</artifactId>
  8. <scope>runtime</scope>
  9. </dependency>

Note

要自动配置嵌入式数据库,你需要spring-jdbc依赖.在本例中,它是通过spring-boot-starter-data-jpa依赖传递过来的.

Tip

无论什么原因,如果你配置了嵌入式数据库的连接URL,请务必确保数据库的自动关机是禁用的.如果你使用H2,您应该使用DB_CLOSE_ON_EXIT=FALSE. 如果你使用HSQLDB,您应该确保未配置shutdown=true.禁用数据库的自动关机能让Spring Boot在数据库关闭时进行控制,从而确保不再需要发生一次访问数据库.

Connection to a Production Database

生产环境的数据库连接也可以通过使用数据源连接池自动配置.Spring Boot使用以下逻辑选择一个特定的实现:

  1. 考虑到HikariCP的性能和并发性,如果HikariCP可用,我们总是选择它.
  2. 否则,如果Tomcat的数据库连接池可用,我们使用它.
  3. 如果HikariCP和Tomcat数据库连接池不可用并且Commons DBCP2可用,我们使用它.

如果你使用spring-boot-starter-jdbcspring-boot-starter-data-jpa的starters,你将会自动得到HikariC的依赖.

Note

你完全可以绕过这个算法,可通过设置spring.datasource.type属性来指定要使用的连接池.如果你在一个Tomcat容器运行您的应用程序,这将特别重要,因为默认提供的数据库连接池为tomcat-jdbc.

Tip

总是可以手动配置额外的连接池.如果你定义自己的数据库连接池实例,自动配置功能将失效.

数据源配置由外部配置属性spring.datasource.*控制.例如,您可能在application.properties声明以下部分:

  1. spring.datasource.url=jdbc:mysql://localhost/test
  2. spring.datasource.username=dbuser
  3. spring.datasource.password=dbpass
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Note

您至少应该通过设置spring.datasource.url属性来指定URL.否则,Spring Boot试图自动配置嵌入式数据库.

Tip

你通常不需要指定driver-class-name,因为Spring Boot可根据url为大多数数据库推断出数据库驱动.

Note

为了创建数据库连接池,我们需要验证一个有效的驱动程序类是可用的,因此在做任何事之前我们必须检查. 换句话说,如果你配置spring.datasource.driver-class-name=com.mysql.jdbc.Driver,那么这个类必须是可被加载的.

更多支持的选项请参见DataSourceProperties文件. 这些都是考虑到实际工作实现的标准参数选项.微调特定实现的参数配置也是可行的,通过使用它们各自的前缀(spring.datasource.hikari.*spring.datasource.tomcat.*,spring.datasource.dbcp2.*)进行设置. 参考你正在使用的连接池的实现文档了解更多细节.例如,如果您使用Tomcat连接池,你能够自定义许多额外的设置.如下例所示:

  1. # Number of ms to wait before throwing an exception if no connection is available.
  2. spring.datasource.tomcat.max-wait=10000
  3. # Maximum number of active connections that can be allocated from this pool at the same time.
  4. spring.datasource.tomcat.max-active=50
  5. # Validate the connection before borrowing it from the pool.
  6. spring.datasource.tomcat.test-on-borrow=true

Connection to a JNDI DataSource

如果你部署Spring Boot应用程序到应用程序服务器,您可能需要使用您的应用程序服务器内置的特性来配置和管理你的数据源,使用JNDI可以做到这一点.

作为spring.datasource.url,spring.datasouce.usernamespring.datasource.password属性的替换, JNDI使用spring.datasource.jndi-name配置特定的JNDI位置访问数据源. 例如,application.properties文件中的下述部分显示了如何访问一个JBoss定义的数据源:

  1. spring.datasource.jndi-name=java:jboss/datasources/customers