Multiple Datasources trong ứng dụng Spring Boot

Đối với các ứng dụng Spring Boot chỉ làm việc với một database thì các bạn có thể tham khảo bài viết Cấu hình database trong Spring Boot project sử dụng JPA Starter dependency để biết cách cấu hình database cho ứng dụng. Trong thực tế thì đôi khi chúng ta sẽ làm việc với các ứng dụng cần connect tới 2 hoặc nhiều database khác nhau. Vậy trong những trường hợp này, làm thế nào chúng ta có thể connect tới tất cả các database này để làm việc với chúng? Mình sẽ hướng dẫn các bạn làm điều này trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Spring Boot project với Spring Data JPA Starter, MySQL Driver, PostgreSQL Driver và Lombok để làm ví dụ:

MySQL Driver và PostgreSQL Driver sẽ giúp ứng dụng ví dụ của mình có thể connect tới MySQL database và PostgreSQL database để làm ví dụ đó các bạn!

Để làm ví dụ và để đơn giản, mình sẽ định nghĩa 1 table trong MySQL database chứa thông tin sinh viên với 2 cột như sau:

Entity của table “student” như sau:

Repository class cho entity Student này như sau:

Tương tự, mình cũng định nghĩa 1 table trong PostgreSQL database chứa thông tin lớp học với 2 cột như sau:

Entity của table “clazz” sẽ như sau:

Repository class cho entity Clazz như sau:

Bây giờ, mình sẽ cấu hình thông tin của 2 database này nha các bạn.

Mình sẽ tạo mới class PostgreSQLDatabaseConfiguration để cấu hình cho PostgreSQL database với annotation @EnableJpaRepositories như sau:

Thuộc tính basePackages sẽ có giá trị là package chứa tất cả các repository liên quan đến PostgreSQL database, của mình ở đây là “com.huongdanjava.springboot.postgresql.repository” đó các bạn! Giá trị của 2 thuộc tính entityManagerFactoryRef và transactionManagerRef sẽ trỏ đến 2 bean mà mình sẽ định nghĩa cho PostgreSQL database như sau:

Do một số nguyên nhân liên quan đến việc auto-configuration, class EntityManagerFactoryBuilder trong class JpaBaseConfiguration cần xác định bean của class Datasource để khởi tạo bản thân nó trong Spring container, các bạn cần chỉ định một trong 2 bean Datasource cho 2 database của chúng ta là primary bằng cách sử dụng annotation @Primary của Spring, như mình đã làm ở trên.

Thông tin liên quan đến PostgreSQL database mình sẽ cấu hình trong tập tin application.properties như sau:

Các bạn lưu ý là chúng ta cần khai báo postgresql.datasource.jdbc-url thay vì postgresql.datasource.url bởi vì mặc định Spring Boot sẽ khởi tạo HirakiDataSource. Class HirakiDataSource này sử dụng class HikariConfig để lưu thông tin cấu hình database. Class HikariConfig này sử dụng thuộc tính jdbcUrl để lưu thông tin về connection string đó các bạn!

Tương tự như cho PostgreSQL, cho MySQL database, mình cũng sẽ tạo mới class MySQLDatabaseConfiguration để cấu hình cho nó như sau:

Thông tin liên quan đến MySQL database, mình cũng sẽ cấu hình trong tập tin application.properties như sau:

Bây giờ, mình sẽ implement interface CommandLineRunner cho class SpringBootMultipleDatasourcesApplication để lấy thông tin sinh viên và lớp học từ 2 database trên như sau:

Nếu trong MySQL và PostgreSQL database của mình có những thông tin về lớp học và sinh viên như sau:

MySQL:

PostgreSQL:

thì khi chạy ví dụ, các bạn sẽ thấy kết quả như sau:

Như vậy là chúng ta đã cấu hình thành công cho ứng dụng Spring Boot có thể kết nối và làm việc với nhiều database cùng lúc rồi đó các bạn!

5/5 - (1 bình chọn)

Add Comment