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
.DB_CLOSE_ON_EXIT=FALSE
. Если вы используете HSQLDB, то следует убедиться, что shutdown=true
не используется. Отключение функции автоматического закрытия базы данных позволяет Spring Boot контролировать момент закрытия базы данных, тем самым гарантируя, что это произойдет, когда доступ к базе данных больше не будет нужен.Подключение к производственной базе данных
Подключения к производственной базе данных также можно автоматически сконфигурировать с помощью пулинга DataSource
.
Конфигурация DataSource
Конфигурацией DataSource управляют внешние конфигурационные свойства в spring.datasource.*
. Например, можно объявить следующий раздел в application.properties
:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring:
datasource:
url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
spring.datasource.url
. В противном случае Spring Boot будет пытаться автоматически сконфигурировать встроенную базу данных.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, можно настроить множество дополнительных параметров, как это показано в следующем примере:
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.test-on-borrow=true
spring:
datasource:
tomcat:
max-wait: 10000
max-active: 50
test-on-borrow: true
Это код настроит пул на ожидание 10000 мс перед тем, как будет брошено исключение, если соединение окажется недоступным, ограничит максимальное количество соединений до 50 и будет проверять соединение перед тем, как позаимствовать его из пула.
Поддерживаемые пулы соединений
Spring Boot использует следующий алгоритм для выбора конкретной реализации:
-
Мы предпочитаем HikariCP за его производительность и параллелизм. Если есть возможность использовать HikariCP, мы всегда выбираем его.
-
В противном случае, если доступен пул
DataSource
из Tomcat, используется он -
Если таковое недоступно, но доступен Commons DBCP2, то используем его.
-
Если 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:
spring.datasource.jndi-name=java:jboss/datasources/customers
spring:
datasource:
jndi-name: "java:jboss/datasources/customers"