Bài viết này dựa trên phiên bản Spring Boot 2.7.3.
Cấu hình cơ bản Data Source trong Spring Boot
Spring Boot cung cấp một loạt các cấu hình spring.datasource.* để điều khiển cấu hình DataSource. Người dùng có thể chỉ định cấu hình Data Source trong tệp application.properties hoặc application.yml. Các cấu hình này được duy trì trong DataSourceProperties.
Dưới đây là một ví dụ cấu hình Data Source MySQL cơ bản (tất cả các trường đều là bắt buộc):
Hãy thay thế url, username, password bằng thông tin thực tế.
Kết nối Data Source nhúng trong Spring Boot
Sử dụng cơ sở dữ liệu nhớ trong bộ nhớ để phát triển ứng dụng thường rất tiện lợi. Rõ ràng, cơ sở dữ liệu nhớ không cung cấp lưu trữ vĩnh viễn. Người dùng cần điền dữ liệu vào cơ sở dữ liệu khi ứng dụng bắt đầu và sẵn sàng loại bỏ dữ liệu khi ứng dụng kết thúc.
Spring Boot có thể tự động cấu hình cơ sở dữ liệu nhúng H2, HSQL và Derby. Người dùng không cần cung cấp bất kỳ URL kết nối nào, chỉ cần bao gồm các phụ thuộc xây dựng cho cơ sở dữ liệu nhúng mà bạn muốn sử dụng. Nếu có nhiều cơ sở dữ liệu nhúng trên lớp đường dẫn, bạn cần thiết lập thuộc tính cấu hình spring.datasource.embedded-database-connection để kiểm soát cơ sở dữ liệu nhúng nào được sử dụng. Đặt thuộc tính này thành none sẽ vô hiệu hóa cấu hình tự động cơ sở dữ liệu nhúng.
Lưu ý: Nếu sử dụng tính năng này trong kiểm thử, dù có bao nhiêu ngữ cảnh ứng dụng, toàn bộ bộ kiểm thử sẽ sử dụng cùng một cơ sở dữ liệu. Nếu bạn muốn đảm bảo mỗi ngữ cảnh có một cơ sở dữ liệu nhúng riêng, bạn nên đặt spring.datasource.generate-unique-name thành true.
Dưới đây là một ví dụ về cách kết nối cơ sở dữ liệu nhúng H2.
(1) Thêm các phụ thuộc cần thiết vào pom.xml:
(2) Cấu hình Data Source:
Kết nối cơ sở dữ liệu được gom nhóm trong Spring Boot
Trong môi trường sản xuất, vì lý do hiệu suất, thường sử dụng cơ sở dữ liệu được gom nhóm để kết nối nguồn dữ liệu.
Ngoài các cấu hình chung của nguồn dữ liệu trong DataSourceProperties, Spring Boot cũng hỗ trợ cấu hình các thuộc tính cụ thể của cơ sở dữ liệu bằng cách sử dụng tiền tố tương ứng như spring.datasource.hikari.*, spring.datasource.tomcat.*, spring.datasource.dbcp2.* và spring.datasource.oracleucp.*.
Dưới đây là một ví dụ cấu hình cho cơ sở dữ liệu gom nhóm Hikari:
Spring Boot sẽ kiểm tra xem gom nhóm kết nối có khả dụng hay không theo thứ tự sau, nếu khả dụng, nó sẽ chọn DataSource được gom nhóm tương ứng:
Người dùng cũng có thể chỉ định loại nguồn dữ liệu bằng cách sử dụng spring.datasource.type.
Ngoài ra, bạn cũng có thể sử dụng DataSourceBuilder để cấu hình gom nhóm kết nối khác. Nếu bạn tạo bean DataSource tùy chỉnh, Spring Boot sẽ không tự động cấu hình. DataSourceBuilder hỗ trợ các gom nhóm kết nối sau:
HikariCP
Tomcat pooling Datasource
Commons DBCP2
Oracle UCP & OracleDataSource
Spring Framework’s SimpleDriverDataSource
H2 JdbcDataSource
PostgreSQL PGSimpleDataSource
C3P0
Nhúng các phụ thuộc Spring Boot
Bạn có thể sử dụng trình khởi tạo chính thức của Spring Boot (Spring Initializr) để chọn các thành phần bạn cần và tạo một dự án Spring Boot. Hoặc, bạn có thể nhúng các phụ thuộc cần thiết trực tiếp vào file pom.xml:
Kiểm tra kết nối đến nguồn dữ liệu đơn
Sau khi chạy phương thức main, console sẽ hiển thị nội dung sau, cho thấy kết nối đến nguồn dữ liệu thành công:
Các phụ thuộc cần thiết để kết nối đến nhiều nguồn dữ liệu trong Spring Boot không khác biệt, sự khác biệt chính nằm trong cấu hình nguồn dữ liệu. Lớp cấu hình nguồn dữ liệu mặc định của Spring Boot là org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration. Người dùng chỉ cần chỉ định một số cấu hình spring.datasource cần thiết, lớp DataSourceAutoConfiguration sẽ tự động hoàn thành phần còn lại của việc khởi tạo nguồn dữ liệu.
Cấu hình nhiều nguồn dữ liệu
Trong ví dụ dưới đây, tạo một lớp cấu hình nguồn dữ liệu tùy chỉnh, thông qua việc đọc các cấu hình khác nhau của spring.datasource.xxx để khởi tạo các nguồn dữ liệu khác nhau. Đối với JDBC, quan trọng nhất là khởi tạo DataSource và JdbcTemplate.
Cấu hình trong file application.properties hoặc application.yml cũng phải được cấu hình với tiền tố được chỉ định bởi @ConfigurationProperties:
Kiểm tra kết nối đến nhiều nguồn dữ liệu
Sau khi chạy phương thức main, console sẽ hiển thị nội dung sau, cho thấy kết nối đến nhiều nguồn dữ liệu thành công:
21:16:44.654 [main] [INFO ] i.g.d.s.d.SpringBootDataJdbcMultiDataSourceApplication.printDataSourceInfo - Url nguồn dữ liệu: jdbc:mysql://localhost:3306/spring_tutorial?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
21:16:44.654 [main] [INFO ] i.g.d.s.d.SpringBootDataJdbcMultiDataSourceApplication.run - Kết nối đến nguồn dữ liệu mysql thành công.
21:16:44.726 [main] [INFO ] i.g.d.s.d.SpringBootDataJdbcMultiDataSourceApplication.printDataSourceInfo - Url nguồn dữ liệu: jdbc:h2:mem:test
21:16:44.726 [main] [INFO ] i.g.d.s.d.SpringBootDataJdbcMultiDataSourceApplication.run - Kết nối đến nguồn dữ liệu h2 thành công.
Data Source trong Spring
Nếu dự án của bạn là một dự án Spring truyền thống, bạn cũng có thể dễ dàng thiết lập kết nối nguồn dữ liệu, chỉ cần cấu hình thêm một số thiết lập.
Nhúng các phụ thuộc Spring
Trong file pom.xml, thêm các phụ thuộc cần thiết:
Cấu hình Data Source trong Spring
Cấu hình nguồn dữ liệu trong Spring có nhiều cách khác nhau, dưới đây là một số ví dụ:
Sử dụng JNDI nguồn dữ liệu
Nếu ứng dụng Spring được triển khai trên máy chủ WEB hỗ trợ JNDI (như WebSphere, JBoss, Tomcat, v.v.), bạn có thể sử dụng JNDI để lấy nguồn dữ liệu.
Sử dụng cơ sở dữ liệu có gom cụm
Spring không cung cấp cơ sở dữ liệu gom nhóm mặc định, bạn cần tự chọn một cơ sở dữ liệu gom nhóm phù hợp. Dưới đây là một ví dụ sử dụng Druid làm cơ sở dữ liệu gom nhóm:
Thông qua các ví dụ trước đó, chúng ta đã biết cách Spring và Spring Boot kết nối đến nguồn dữ liệu và truy cập cơ sở dữ liệu thông qua JDBC.
Cách cấu hình nguồn dữ liệu trong Spring Boot là thông qua việc chỉ định cấu hình spring.datasource.* trong tệp application.properties hoặc application.yml.
(1) Cách cấu hình cơ bản là chỉ định url, tên người dùng và mật khẩu:
(2) Cấu hình JNDI
Nếu bạn muốn kết nối đến nguồn dữ liệu thông qua JNDI, bạn có thể sử dụng cách sau:
Lớp DataSourceAutoConfiguration
Rõ ràng, cấu hình của Spring Boot đơn giản hơn, vậy Spring Boot đã làm những công việc gì để làm cho việc tích hợp trở nên dễ dàng hơn? Bí mật nằm trong gói jar spring-boot-autoconfigure, trong đó định nghĩa nhiều lớp tự động cấu hình của Spring Boot. Trong số đó, các lớp cấu hình liên quan đến truy cập cơ sở dữ liệu quan trọng bao gồm:
DataSourceAutoConfiguration: Lớp cấu hình tự động cho nguồn dữ liệu
JdbcTemplateAutoConfiguration: Lớp cấu hình tự động cho JdbcTemplate
DataSourceTransactionManagerAutoConfiguration: Lớp cấu hình tự động cho quản lý giao dịch nguồn dữ liệu
JndiDataSourceAutoConfiguration: Lớp cấu hình tự động cho nguồn dữ liệu JNDI
EmbeddedDataSourceConfiguration: Lớp cấu hình tự động cho nguồn dữ liệu cơ sở dữ liệu nhúng
Và nhiều hơn nữa
Các lớp cấu hình tự động này sẽ tạo ra các phiên bản của các lớp cốt lõi dựa trên các điều kiện khác nhau.
DataSourceAutoConfiguration là lớp cấu hình tự động cho nguồn dữ liệu, nó có trách nhiệm tạo ra một phiên bản của DataSource.
Mã nguồn của DataSourceAutoConfiguration như sau (bỏ qua một số mã):
Giải thích mã nguồn của lớp DataSourceAutoConfiguration:
DataSourceProperties là lớp tùy chọn cấu hình của DataSourceAutoConfiguration, cho phép người dùng điều khiển hành vi khởi tạo của DataSource thông qua việc thiết lập các tùy chọn.
DataSourceAutoConfiguration sử dụng @Import để nhập lớp DataSourcePoolMetadataProvidersConfiguration.
DataSourceAutoConfiguration định nghĩa hai lớp nội bộ: EmbeddedDatabaseConfiguration và PooledDataSourceConfiguration, mỗi lớp đánh dấu một điều kiện khác nhau để tạo ra phiên bản tương ứng.
Khi điều kiện của EmbeddedDatabaseConfiguration được đáp ứng, lớp EmbeddedDataSourceConfiguration sẽ được nhập để khởi tạo nguồn dữ liệu. Thực tế, lớp này tải ClassLoader của trình điều khiển nguồn dữ liệu nhúng để thực hiện khởi tạo.
Khi điều kiện của PooledDataSourceConfiguration được đáp ứng, các lớp cấu hình DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class sẽ được nhập. Mỗi lớp tương ứng với một loại cơ sở dữ liệu kết nối theo cách khác nhau. Cụ thể sử dụng loại nào trong số các loại kết nối cơ sở dữ liệu, có thể được chỉ định thông qua cấu hình spring.datasource.type. Trong đó, Hikari là cơ sở dữ liệu kết nối mặc định của Spring Boot, spring-boot-starter-data-jdbc đã tích hợp sẵn gói trình điều khiển Hikari. Nếu muốn thay thế bằng cơ sở dữ liệu kết nối khác, điều kiện tiên quyết là phải thủ công nhập gói trình điều khiển tương ứng.