Spring Boot интегрируется с рядом технологий сбора, передачи и обработки данных, как SQL, так и NoSQL.

Базы данных SQL

Spring Framework предусматривает комплексные средства поддержки для работы с базами данных SQL, начиная прямым доступом к JDBC с помощью JdbcTemplate и заканчивая полноценными технологиями "объектно-реляционного отображения", такими как Hibernate. Spring Data предусматривает дополнительный уровень функциональности: создание реализаций Repository непосредственно из интерфейсов и использование соглашений для генерации запросов из имен методов.

Конфигурирование DataSource

Java-интерфейс javax.sql.DataSource предусматривает стандартный метод работы с подключениями к базе данных. Традиционно "DataSource" использует URL-адрес вместе с некоторыми учетными данными для установления соединения с базой данных.

Поддержка встроенных баз данных

Зачастую удобнее разрабатывать приложения, используя встроенную резидентную базу данных. Очевидно, что резидентные базы данных не обеспечивают постоянное хранилище. Необходимо заполнять базу данных при запуске приложения и быть готовым к удалению данных при завершении работы приложения.

Spring Boot может автоматически конфигурировать встраиваемые базы данных H2, HSQL и Derby. URL-адреса любого подключения указывать не требуется. Нужно только добавить зависимость сборки от встраиваемой базы данных, которую вы хотите использовать. Если в пути класса имеется несколько встроенных баз данных, установите конфигурационное свойство spring.datasource.embedded-database-connection, чтобы управлять тем, какая из них будет использовать. Установка свойства в значение none отключает автоконфигурацию встроенной базы данных.

Если вы используете эту функцию в своих тестах, то можете заметить, что одна и та же база данных повторно используется всем вашим тестовым комплектом, независимо от количества контекстов приложения, которые вы используете. Если необходимо убедиться, что для каждого контекста имеется отдельная встроенная база данных, следует установить spring.datasource.generate-unique-name в true.

Например, типичные POM-зависимости будут выглядеть следующим образом:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>
Для автоматического конфигурирования встроенной базы данных необходим обеспечить наличие зависимости от spring-jdbc. В данном примере он подтягивается транзитивно через spring-boot-starter-data-jpa.
Если по какой-то причине URL-адрес подключения для встроенной базы данных все же будет сконфигурирован, следует убедиться, что функция автоматического закрытия базы данных отключена. Если вы используете H2, то для этого следует использовать DB_CLOSE_ON_EXIT=FALSE. Если вы используете HSQLDB, то следует убедиться, что shutdown=true не используется. Отключение функции автоматического закрытия базы данных позволяет Spring Boot контролировать момент закрытия базы данных, тем самым гарантируя, что это произойдет, когда доступ к базе данных больше не будет нужен.

Подключение к производственной базе данных

Подключения к производственной базе данных также можно автоматически сконфигурировать с помощью пулинга DataSource.

Конфигурация DataSource

Конфигурацией DataSource управляют внешние конфигурационные свойства в spring.datasource.*. Например, можно объявить следующий раздел в application.properties:

Properties
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
Yaml
spring:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
Необходимо по крайней мере указать URL-адрес, установив свойство spring.datasource.url. В противном случае Spring Boot будет пытаться автоматически сконфигурировать встроенную базу данных.
Spring Boot может определять класс драйвера JDBC для большинства баз данных из URL-адреса. Если требуется задать конкретный класс, то можно использовать свойство spring.datasource.driver-class-name.
Для создания пула DataSource необходимо убедиться, что имеется допустимый класс Driver, поэтому мы проверяем его, прежде чем что-либо предпринимать. Иными словами, если вы устанавливаете spring.datasource.driver-class-name=com.mysql.jdbc.Driver, то этот класс должен стать загружаемым.

Более подробную информацию о поддерживаемых параметрах см. DataSourceProperties. Это стандартные опции, которые работают независимо от фактической реализации. Также можно тонко настроить специфические для конкретной реализации параметры, используя соответствующий префикс (spring.datasource.hikari.*, spring.datasource.tomcat.*, spring.datasource.dbcp2.* и spring.datasource.oracleucp.*). Более подробную информацию см. в документации по используемой вами реализации пула соединений.

Например, если используется пул соединений Tomcat, можно настроить множество дополнительных параметров, как это показано в следующем примере:

Properties
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.test-on-borrow=true
Yaml
spring:
  datasource:
    tomcat:
      max-wait: 10000
      max-active: 50
      test-on-borrow: true

Это код настроит пул на ожидание 10000 мс перед тем, как будет брошено исключение, если соединение окажется недоступным, ограничит максимальное количество соединений до 50 и будет проверять соединение перед тем, как позаимствовать его из пула.

Поддерживаемые пулы соединений

Spring Boot использует следующий алгоритм для выбора конкретной реализации:

  1. Мы предпочитаем HikariCP за его производительность и параллелизм. Если есть возможность использовать HikariCP, мы всегда выбираем его.

  2. В противном случае, если доступен пул DataSource из Tomcat, используется он

  3. Если таковое недоступно, но доступен Commons DBCP2, то используем его.

  4. Если HikariCP, Tomcat и DBCP2 невозможно использовать, но доступен Oracle UCP, то используем его.

Если вы используете "стартовые пакеты" spring-boot-starter-jdbc или spring-boot-starter-data-jpa, то автоматически получите зависимость от HikariCP.

Можно полностью обойти этот алгоритм и указать используемый пул соединений, установив свойство spring.datasource.type. Это особенно важно, если приложение выполняется в контейнере Tomcat, поскольку tomcat-jdbc предусмотрен по умолчанию.

Дополнительные пулы соединений всегда можно сконфигурировать вручную, используя DataSourceBuilder. Если вы определяете свой собственный бин DataSource, автоматического конфигурирования не произойдет. DataSourceBuilder поддерживает следующие пулы соединений:

  • HikariCP

  • Пул Datasource через Tomcat

  • Commons DBCP2

  • Oracle UCP и OracleDataSource

  • SimpleDriverDataSource из Spring Framework

  • JdbcDataSource из H2

  • PGSimpleDataSource из PostgreSQL

  • C3P0

Подключение к DataSource через JNDI

Если вы развертываете свое приложение Spring Boot на сервере приложений, то вам может потребоваться конфигурировать и управлять DataSource при помощи встроенных функций сервера приложений и получать к нему доступ через JNDI.

Свойство spring.datasource.jndi-name можно использовать как альтернативу свойствам spring.datasource.url, spring.datasource.username и spring.datasource.password для обеспечения доступа к DataSource из определенного местосположения через JNDI. Например, следующий раздел в application.properties показывает, как можно получить доступ к DataSource, определенному на сервере JBoss AS:

Properties
spring.datasource.jndi-name=java:jboss/datasources/customers
Yaml
spring:
  datasource:
    jndi-name: "java:jboss/datasources/customers"