Конфигуриране на Tomcat Connection Pool в Spring Boot

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 Connection Pool, ако е наличен
  3. Ако нито една от тези опции не е налична, Spring Boot ще избере Apache Commons DBCP2, ако това е налично

За да конфигурирате Tomcat JDBC връзка басейн вместо HikariCP по подразбиране, ще се изключат HikariCP от пролетните зареждане стартер данни на СПА зависимостта и добавете котарак-JDBC Maven зависимостта към нашия 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 и програмно да дефинираме компонент DataSource .

Също така си струва да се отбележи, че в този случай използваме базата данни H2 в паметта . Spring Boot автоматично ще конфигурира H2 за нас, без да се налага да посочвате URL адрес, потребител и парола на базата данни .

Просто трябва да включим съответната зависимост във файла „pom.xml“ и Spring Boot ще свърши останалото вместо нас.

Като алтернатива е възможно да се пропусне алгоритъмът за сканиране на пула от връзки, който Spring Spring стартира, и изрично да се посочи източник на данни за обединяване на връзки във файла „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. В Клиентът Entity клас

Нека първо дефинираме наивен клас обект на клиент :

@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 операции на няколко клиентски обекта . Освен това трябва да изберем всички клиенти, които съответстват на дадено фамилно име.

И така, всичко, което трябва да направим, е да разширим интерфейса CrudRepository на Spring Data JPA и да дефинираме персонализиран метод :

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

Сега можем лесно да извлечем обект на Клиент с неговото фамилно име.

5.3. В CommandLineRunner изпълнение

И накрая, трябва поне да поддържаме няколко обекта на Клиента в базата данни и да проверяваме дали нашият пул за връзки 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 първо записва няколко обекта на клиента в базата данни. След това извлича първата с помощта на метода 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.