Перейти к основному содержимому

Настройка пула соединений Tomcat в Spring Boot

· 5 мин. чтения

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 автоматически настраивает источник данных пула соединений:

  1. Spring Boot будет искать HikariCP в пути к классам и использовать его по умолчанию, если он присутствует.
  2. Если HikariCP не найден в пути к классам, то Spring Boot выберет пул соединений Tomcat JDBC, если он доступен.
  3. Если ни один из этих вариантов недоступен, 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 .