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

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

1. обзор

Spring Boot - это самоуверенный, но мощный уровень абстракции, размещенный поверх простой платформы Spring, что упрощает разработку автономных и веб-приложений. Spring Boot предоставляет несколько удобных «стартовых» зависимостей, направленных на запуск и тестирование Java-приложений с минимальными затратами.

One key component of these starter dependencies is spring-boot-starter-data-jpa. Это позволяет нам использоватьJPA и работать с производственными базами данных, используя некоторые популярные реализации пула соединений JDBC, такие какHikariCP иTomcat JDBC Connection Pool.

В этом руководствеwe’ll learn how to configure a Tomcat connection pool in 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 по умолчанию, мы добавимexclude HikariCP from the spring-boot-starter-data-jpa dependency and add the tomcat-jdbc Maven dependency к нашемуpom.xml:


    org.springframework.boot
    spring-boot-starter-data-jpa
    
        
            com.zaxxer
            HikariCP
        
    


    org.apache.tomcat
    tomcat-jdbc
    9.0.10


    com.h2database
    h2
    1.4.197
    runtime

Этот простой подход позволяет нам получить Spring Boot с использованием пула соединений Tomcat без необходимости писать класс@Configuration и программно определять bean-компонентDataSource.

It’s also worth noting that in this case, we’re using the H2 in-memory database. Spring Boot will autoconfigure H2 for us, without having to specify a database URL, user, and password.

Нам просто нужно включить соответствующую зависимость в файл“pom.xml”, а Spring Boot сделает все остальное за нас.

В качестве альтернативыit’s possible to skip the connection pool scanning algorithm that Spring Boot uses and explicitly specify a connection pooling datasource в“application.properties” file, с использованием свойства“spring.datasource.type”:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
// other spring datasource properties

3. Настройка пула подключений с помощью файла «application.properties»

После того, как мы успешно настроили пул соединений Tomcat в Spring Boot,it’s very likely that we’ll want to set up some additional properties, for optimizing its performance and suiting some specific requirements.

Мы можем сделать это в файле“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, проверьтеthis article.

5.1. Класс сущностиCustomer

Давайте сначала определим наивный класс сущности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.. Кроме того, нам нужно получить всех клиентов, которые соответствуют заданной фамилии.

Итак,all that we have to do is to extend Spring Data JPA’s CrudRepository interface and define a tailored method:

public interface CustomerRepository extends CrudRepository {
    List findByLastName(String lastName);
}

Теперь мы можем легко получить объектCustomer по его фамилии.

5.3. РеализацияCommandLineRunner

Наконец, нам нужно как минимум сохранить несколько сущностейCustomer в базе данных иverify that our Tomcat connection pool is actually working.

Давайте создадим реализацию интерфейса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.

Как обычно, все примеры кода, показанные в этом руководстве, доступныover on GitHub.