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"