Mengkonfigurasi Kolam Sambungan Tomcat di Spring Boot

1. Gambaran keseluruhan

Spring Boot adalah lapisan abstraksi yang disokong - namun kuat - diletakkan di atas platform Spring biasa, yang menjadikan pengembangan aplikasi web yang berdiri sendiri dan tidak perlu dipertimbangkan. Spring Boot menyediakan beberapa dependensi "starter" yang berguna, yang bertujuan untuk menjalankan dan menguji aplikasi Java dengan jejak minimum.

Salah satu komponen utama kebergantungan pemula ini adalah spring-boot-starter-data-jpa . Ini membolehkan kita menggunakan JPA dan bekerja dengan pangkalan data pengeluaran dengan menggunakan beberapa implementasi penyatuan sambungan JDBC yang popular, seperti HikariCP dan Tomcat JDBC Connection Pool.

Dalam tutorial ini, kita akan belajar bagaimana mengkonfigurasi kumpulan sambungan Tomcat di Spring Boot .

2. Pergantungan Maven

Spring Boot menggunakan HikariCP sebagai kumpulan sambungan lalai, kerana prestasi yang luar biasa dan ciri-ciri yang sesuai untuk perusahaan.

Inilah cara Spring Boot secara automatik mengkonfigurasi sumber data kumpulan sambungan:

  1. Spring Boot akan mencari HikariCP di classpath dan menggunakannya secara lalai ketika hadir
  2. Sekiranya HikariCP tidak dijumpai di classpath, maka Spring Boot akan mengambil Tomcat JDBC Connection Pool, jika ada
  3. Sekiranya tidak ada pilihan ini, Spring Boot akan memilih Apache Commons DBCP2, jika tersedia

Untuk mengkonfigurasi kumpulan sambungan Tomcat JDBC dan bukannya HikariCP lalai, kami akan mengecualikan HikariCP dari pergantungan spring-boot-starter-data-jpa dan menambahkan kebergantungan tomcat-jdbc Maven ke pom.xml kami :

 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 

Pendekatan mudah ini membolehkan kita mendapatkan Spring Boot menggunakan kumpulan sambungan Tomcat tanpa perlu menulis kelas @Configuration dan menentukan secara teratur kacang DataSource .

Perlu diingat bahawa dalam kes ini, kita menggunakan pangkalan data H2 dalam memori . Spring Boot akan mengkonfigurasi secara automatik H2 untuk kami, tanpa perlu menentukan URL pangkalan data, pengguna, dan kata laluan .

Kita hanya perlu memasukkan kebergantungan yang sesuai dalam fail "pom.xml" dan Spring Boot akan melakukan yang lain untuk kita.

Sebagai alternatif, mungkin untuk melangkau algoritma pengimbasan kumpulan sambungan yang digunakan Spring Boot dan secara eksplisit menentukan sumber data penyatuan dalam fail "application.properties" , menggunakan sifat "spring.datasource.type" :

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

3. Mengambil Kumpulan Sambungan Dengan Fail " application.properties "

Setelah berjaya mengkonfigurasi kumpulan sambungan Tomcat di Spring Boot, kemungkinan besar kami ingin menyediakan beberapa sifat tambahan, untuk mengoptimumkan kinerjanya dan sesuai dengan beberapa keperluan khusus .

Kita boleh melakukannya dalam fail "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 

Harap perhatikan bahawa kami telah mengkonfigurasi beberapa sifat penyatuan sambungan tambahan, seperti ukuran awal kolam, dan bilangan maksimum dan minimum sambungan terbiar.

Kami juga dapat menentukan beberapa sifat khusus 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. Menguji Kolam Sambungan

Mari tulis ujian integrasi mudah untuk memeriksa bahawa Spring Boot telah mengkonfigurasi kumpulan sambungan dengan betul:

@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. Contoh Permohonan Perintah

Dengan semua paip penyambungan sambungan sudah siap, mari kita bina aplikasi baris perintah yang mudah.

Dengan berbuat demikian, kita dapat melihat bagaimana melakukan beberapa operasi CRUD pada pangkalan data H2 menggunakan lapisan DAO yang kuat yang disediakan Spring Data JPA (dan secara sementara, Spring Boot) di luar kotak.

Untuk panduan terperinci mengenai cara mula menggunakan Spring Data JPA, sila baca artikel ini.

5.1. The Pelanggan Entity Kelas

Mari tentukan terlebih dahulu kelas entiti Pelanggan yang naif :

@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. The CustomerRepository Interface

Dalam kes ini, kami hanya mahu menjalankan operasi CRUD pada beberapa entiti Pelanggan . Selain itu, kita perlu mengambil semua pelanggan yang sesuai dengan nama belakang yang diberikan.

Oleh itu, yang harus kita lakukan adalah memperluaskan antara muka CrudRepository Spring Data JPA dan menentukan kaedah yang disesuaikan :

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

Sekarang kita dapat dengan mudah mengambil entiti Pelanggan dengan nama belakangnya.

5.3. The CommandLineRunner Pelaksanaan

Akhirnya, kita sekurang-kurangnya memerlukan beberapa entiti Pelanggan dalam pangkalan data dan mengesahkan bahawa kumpulan sambungan Tomcat kami benar-benar berfungsi .

Mari buat pelaksanaan antara muka CommandLineRunner Spring Boot . Spring Boot akan melancarkan pelaksanaan sebelum melancarkan aplikasi:

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()); }); } }

Ringkasnya, kelas CommandLineCrudRunner terlebih dahulu menyimpan beberapa entiti Pelanggan dalam pangkalan data. Seterusnya, ia mengambil yang pertama menggunakan kaedah findById () . Akhirnya, ia mendapatkan pelanggan dengan kaedah findByLastName () .

5.4. Menjalankan Aplikasi Spring Boot

Sudah tentu, perkara terakhir yang perlu kita lakukan hanyalah menjalankan aplikasi sampel. Kemudian kita dapat melihat tandas kolam sambungan Spring Boot / Tomcat beraksi:

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

6. Kesimpulannya

Dalam tutorial ini, kami belajar bagaimana mengkonfigurasi dan menggunakan kumpulan sambungan Tomcat di Spring Boot. Sebagai tambahan, kami mengembangkan aplikasi baris perintah asas untuk menunjukkan betapa mudahnya bekerja dengan Spring Boot, kumpulan sambungan Tomcat, dan pangkalan data H2.

Seperti biasa, semua contoh kod yang ditunjukkan dalam tutorial ini terdapat di GitHub.