1. Обзор
Spring Boot — это самоуверенный, но мощный уровень абстракции, размещенный поверх простой платформы Spring, что упрощает разработку автономных и веб-приложений. Spring Boot предоставляет несколько удобных «начальных» зависимостей, предназначенных для запуска и тестирования Java-приложений с минимальными затратами.
Одним из ключевых компонентов этих начальных зависимостей является spring-boot-starter-data-jpa
. Это позволяет нам использовать JPA и работать с производственными базами данных с помощью некоторых популярных реализаций пулов соединений JDBC, таких как HikariCP и Tomcat JDBC Connection Pool .
В этом руководстве мы узнаем, как настроить пул соединений Tomcat в Spring Boot .
2. Зависимости Maven
Spring Boot использует HikariCP в качестве пула соединений по умолчанию из-за его замечательной производительности и готовых к работе функций.
Вот как Spring Boot автоматически настраивает источник данных пула соединений:
- Spring Boot будет искать HikariCP в пути к классам и использовать его по умолчанию, если он присутствует.
- Если HikariCP не найден в пути к классам, то Spring Boot выберет пул соединений Tomcat JDBC, если он доступен.
- Если ни один из этих вариантов недоступен, Spring Boot выберет Apache Commons DBCP2 , если он доступен .
Чтобы настроить пул соединений Tomcat JDBC вместо HikariCP по умолчанию, мы исключим HikariCP
из зависимости spring-boot-starter-data-jpa
и добавим зависимость tomcat-jdbc
Maven в наш pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.10</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>runtime</scope>
</dependency>
Этот простой подход позволяет нам получить Spring Boot с использованием пула соединений Tomcat без необходимости писать класс @Configuration
и программно определять bean-компонент DataSource
.
Также стоит отметить, что в этом случае мы используем базу данных H2 в памяти . Spring Boot автоматически настроит для нас H2 без указания URL-адреса базы данных, пользователя и пароля .
Нам просто нужно включить соответствующую зависимость в файл «pom.xml»
, а Spring Boot сделает все остальное за нас.
В качестве альтернативы можно пропустить алгоритм сканирования пула соединений, который использует Spring Boot, и явно указать источник данных пула соединений в файле «application.properties»
,
используя свойство «spring.datasource.type»
:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
// other spring datasource properties
3. Настройка пула соединений с помощью файла « application.properties ».
После того, как мы успешно настроили пул соединений Tomcat в Spring Boot, вполне вероятно, что мы захотим настроить некоторые дополнительные свойства для оптимизации его производительности и соответствия некоторым конкретным требованиям .
Мы можем сделать это в файле «application.properties» :
spring.datasource.tomcat.initial-size=15
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=15
spring.datasource.tomcat.min-idle=8
spring.datasource.tomcat.default-auto-commit=true
Обратите внимание, что мы настроили несколько дополнительных свойств пула соединений, таких как начальный размер пула, а также максимальное и минимальное количество простаивающих соединений.
Мы также можем указать некоторые свойства, характерные для Hibernate:
# Hibernate specific properties
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.id.new_generator_mappings=false
4. Тестирование пула соединений
Давайте напишем простой интеграционный тест, чтобы проверить, правильно ли Spring Boot настроил пул соединений:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTomcatConnectionPoolIntegrationTest {
@Autowired
private DataSource dataSource;
@Test
public void givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect() {
assertThat(dataSource.getClass().getName())
.isEqualTo("org.apache.tomcat.jdbc.pool.DataSource");
}
}
5. Пример приложения командной строки
Теперь, когда вся инфраструктура пула подключений уже настроена, давайте создадим простое приложение командной строки.
При этом мы можем увидеть, как выполнять некоторые операции CRUD в базе данных H2, используя мощный уровень DAO , который Spring Data JPA (и транзитивно, Spring Boot) предоставляет из коробки.
Подробное руководство о том, как начать использовать Spring Data JPA, можно найти в этой статье .
5.1. Класс сущности клиента
Давайте сначала определим наивный класс сущности Customer :
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "first_name")
private String firstName;
// standard constructors / getters / setters / toString
}
5.2. Интерфейс CustomerRepository
_
В этом случае мы просто хотим выполнить CRUD-операции с несколькими сущностями Customer
. Кроме того, нам нужно получить всех клиентов, которые соответствуют заданной фамилии.
Итак, все, что нам нужно сделать, это расширить интерфейс CrudRepository
Spring Data JPA и определить специальный метод :
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}
Теперь мы можем легко получить объект Customer
по его фамилии.
5.3. Реализация CommandLineRunner
_
Наконец, нам нужно как минимум сохранить несколько сущностей Customer в базе данных и
убедиться, что наш пул соединений Tomcat действительно работает .
Давайте создадим реализацию интерфейса CommandLineRunner Spring Boot.
Spring Boot загрузит реализацию перед запуском приложения:
public class CommandLineCrudRunner implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(CommandLineCrudRunner.class);
@Autowired
private final CustomerRepository repository;
public void run(String... args) throws Exception {
repository.save(new Customer("John", "Doe"));
repository.save(new Customer("Jennifer", "Wilson"));
logger.info("Customers found with findAll():");
repository.findAll().forEach(c -> logger.info(c.toString()));
logger.info("Customer found with findById(1L):");
Customer customer = repository.findById(1L)
.orElseGet(() -> new Customer("Non-existing customer", ""));
logger.info(customer.toString());
logger.info("Customer found with findByLastName('Wilson'):");
repository.findByLastName("Wilson").forEach(c -> {
logger.info(c.toString());
});
}
}
Короче говоря, класс CommandLineCrudRunner
сначала сохраняет в базе данных пару сущностей Customer .
Затем он выбирает первый, используя метод findById()
. Наконец, он извлекает клиента с помощью метода findByLastName()
.
5.4. Запуск приложения Spring Boot
Конечно, последнее, что нам нужно сделать, это просто запустить пример приложения. Затем мы можем увидеть тандем пула соединений Spring Boot/Tomcat в действии:
@SpringBootApplication
public class SpringBootConsoleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootConsoleApplication.class);
}
}
6. Заключение
В этом руководстве мы узнали, как настроить и использовать пул соединений Tomcat в Spring Boot. Кроме того, мы разработали базовое приложение командной строки, чтобы показать, насколько легко работать с Spring Boot, пулом соединений Tomcat и базой данных H2.
Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub .