Konfiguration af en Tomcat-forbindelsespool i Spring Boot

1. Oversigt

Spring Boot er et meningsfuldt - men alligevel kraftigt - abstraktionslag placeret oven på en almindelig Spring-platform, hvilket gør udvikling af enkeltstående og webapplikationer til en no-brainer. Spring Boot giver et par praktiske "start" -afhængigheder, der har til formål at køre og teste Java-applikationer med et minimalt fodaftryk.

En nøglekomponent i disse startafhængigheder er spring-boot-starter-data-jpa. Dette giver os mulighed for at bruge JPA og arbejde med produktionsdatabaser ved hjælp af nogle populære implementeringer af JDBC-forbindelsespooling, såsom HikariCP og Tomcat JDBC Connection Pool.

I denne vejledning vi lærer at konfigurere en Tomcat-forbindelsespulje i Spring Boot.

2. Maven-afhængighederne

Spring Boot bruger HikariCP som standardforbindelsespulje på grund af dets bemærkelsesværdige ydeevne og virksomhedsklare funktioner.

Sådan konfigurerer Spring Boot automatisk en datakilde for en forbindelsespulje:

  1. Spring Boot ser efter HikariCP på klassestien og bruger den som standard, når den er til stede
  2. Hvis HikariCP ikke findes på klassestien, afhenter Spring Boot Tomcat JDBC Connection Pool, hvis den er tilgængelig
  3. Hvis ingen af ​​disse muligheder er tilgængelige, vælger Spring Boot Apache Commons DBCP2, hvis det er tilgængeligt

For at konfigurere en Tomcat JDBC-forbindelsespulje i stedet for standard HikariCP skal vi udelukke HikariCP fra spring-boot-starter-data-jpa afhængighed og tilføj tomcat-jdbc Maven afhængighed til vores 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 

Denne enkle tilgang giver os mulighed for at få Spring Boot ved hjælp af en Tomcat-forbindelsespool uden at skulle skrive en @Konfiguration klasse og programmatisk definere en Datakilde bønne.

Det er også værd at bemærke, at i dette tilfælde bruger vi H2-hukommelsesdatabasen. Spring Boot vil automatisk konfigurere H2 for os uden at skulle angive en database-URL, bruger og adgangskode.

Vi skal bare medtage den tilsvarende afhængighed i “Pom.xml” fil og Spring Boot vil gøre resten for os.

Alternativt det er muligt at springe over den algoritme til forbindelsespoolscanning, som Spring Boot bruger, og udtrykkeligt angive en datakilde for forbindelsespooling i Filen "application.properties", bruger “Spring.datasource.type” ejendom:

spring.datasource.type = org.apache.tomcat.jdbc.pool.DataSource // andre foråret datakildeegenskaber

3. Tilpasning af forbindelsespoolen med “application.properties”Fil

Når vi med succes har konfigureret en Tomcat-forbindelsespulje i Spring Boot, det er meget sandsynligt, at vi ønsker at oprette nogle yderligere egenskaber for at optimere dens ydeevne og tilpasse nogle specifikke krav.

Vi kan gøre det i “Application.properties” fil:

spring.datasource.tomcat.initial-size = 15 spring.datasource.tomcat.max-wait = 20000 spring.datasource.tomcat.max-active = 50 spring.datasource.tomcat.max-inaktiv = 15 spring.datasource.tomcat. min-tomgang = 8 spring.datasource.tomcat.default-auto-commit = true 

Bemærk, at vi har konfigureret et par ekstra egenskaber til pooling af forbindelser, såsom poolens oprindelige størrelse og det maksimale og minimale antal ledige forbindelser.

Vi kan også specificere nogle dvale-specifikke egenskaber:

# Dvale specifikke egenskaber spring.jpa.show-sql = falsk spring.jpa.hibernate.ddl-auto = opdatering spring.jpa.hibernate.naming-strategi = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect spring.jpa.properties.hibernate.id.new_generator_mappings = false 

4. Test af forbindelsespoolen

Lad os skrive en simpel integrationstest for at kontrollere, at Spring Boot korrekt har konfigureret forbindelsespuljen:

@RunWith (SpringRunner.class) @SpringBootTest offentlig klasse SpringBootTomcatConnectionPoolIntegrationTest {@Autowired private DataSource dataSource; @Test offentlig ugyldighed givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect () {assertThat (dataSource.getClass (). GetName ()) .isEqualTo ("org.apache.tomcat.jdbc.pool.DataSource"); }}

5. Et eksempel på en kommandolinjeapplikation

Med al forbindelse pooling VVS allerede indstillet, lad os bygge en simpel kommandolinie applikation.

Ved at gøre det kan vi se, hvordan man udfører nogle CRUD-operationer på en H2-database ved hjælp af det kraftfulde DAO-lag, som Spring Data JPA (og transitivt, Spring Boot) giver ud af kassen.

For en detaljeret vejledning om, hvordan du kommer i gang med Spring Data JPA, se denne artikel.

5.1. Det Kunde Enhedsklasse

Lad os først definere en naiv Kunde enhedsklasse:

@Entity @Table (name = "kunder") offentlig klasse kunde {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat lang id; @Column (name = "first_name") privat streng fornavn; // standardkonstruktører / getters / setters / toString}

5.2. Det Kundeopbevaring Interface

I dette tilfælde vil vi bare udføre CRUD-operationer på nogle få Kunde enheder. Derudover er vi nødt til at hente alle de kunder, der matcher et givet efternavn.

Så, alt hvad vi skal gøre er at udvide Spring Data JPA'er CrudRepository interface og definere en skræddersyet metode:

offentlig grænseflade CustomerRepository udvider CrudRepository {List findByLastName (streng efternavn); }

Nu kan vi nemt hente en Kunde enhed efter sit efternavn.

5.3. Det CommandLineRunner Implementering

Endelig skal vi i det mindste fortsætte et par Kunde enheder i databasen og kontrollere, at vores Tomcat-forbindelsespulje faktisk fungerer.

Lad os oprette en implementering af Spring Boot's CommandLineRunner interface. Spring Boot vil bootstrap implementeringen, før applikationen startes:

offentlig klasse CommandLineCrudRunner implementerer CommandLineRunner {privat statisk endelig loggerlogger = LoggerFactory.getLogger (CommandLineCrudRunner.class); @Autowired privat endelig CustomerRepository repository; offentlig ugyldig kørsel (String ... args) kaster undtagelse {repository.save (ny kunde ("John", "Doe")); repository.save (ny kunde ("Jennifer", "Wilson")); logger.info ("Kunder fundet med findAll ():"); repository.findAll (). forEach (c -> logger.info (c.toString ())); logger.info ("Kunden fundet med findById (1L):"); Kundekunde = repository.findById (1L) .orElseGet (() -> ny kunde ("Ikke-eksisterende kunde", "")); logger.info (customer.toString ()); logger.info ("Kunden fundet med findByLastName ('Wilson'):"); repository.findByLastName ("Wilson"). forEach (c -> {logger.info (c.toString ());}); }}

I en nøddeskal er den CommandLineCrudRunner klasse gemmer først et par Kunde enheder i databasen. Derefter henter den den første ved hjælp af findById () metode. Endelig henter det en kunde med findByLastName () metode.

5.4. Kører Spring Boot-applikationen

Selvfølgelig er den sidste ting, vi skal gøre, bare at køre prøveapplikationen. Så kan vi se Spring Boot / Tomcat-forbindelsespooltandem i aktion:

@SpringBootApplication public class SpringBootConsoleApplication {public static void main (String [] args) {SpringApplication.run (SpringBootConsoleApplication.class); }}

6. Konklusion

I denne vejledning lærte vi, hvordan man konfigurerer og bruger en Tomcat-forbindelsespool i Spring Boot. Derudover udviklede vi en grundlæggende kommandolinjeapplikation for at vise, hvor let det er at arbejde med Spring Boot, en Tomcat-forbindelsespulje og H2-databasen.

Som normalt er alle kodeeksempler vist i denne vejledning tilgængelige på GitHub.