12. Connect Database & mẫu CRUD & switch Oracle/MSSQL
12.Quy định kết nối Database và Message Queue
12.1. Mục tiêu chương
Chuẩn hóa kết nối DB và Message Queue nhằm:
-
Tránh hardcode cấu hình
-
Đảm bảo tính ổn định hạ tầng
-
Kiểm soát tài nguyên hệ thống
12.2. Khái niệm / phạm vi áp dụng
Áp dụng cho:
-
Database
-
RabbitMQ
-
Kafka
-
Core Team và Partner
12.3. Quy định chính
Kết nối Database
Cấu hình datasource tại:
config/**
application-*.yml
-
Không hardcode:
-
host
-
port
-
user
-
password
-
Không tạo JDBC connection thủ công
-
Mọi truy cập DB qua repository/service
Message Queue
-
Kết nối queue do Core Team quản lý
Cấu hình tại:
config/**
common/messaging/**
Partner không được:
-
Tự tạo connection
-
Hardcode config
-
Tự tạo queue/topic
Chuẩn đặt tên queue/topic
<system>.<module>.<purpose>
Ví dụ:
core.audit.log
planning.project.created
auth.user.synced
12.4. Quy trình tạo queue/topic
Tạo ticket:
[QUEUE REQUEST] <module> - <purpose>
-
Cung cấp:
-
module
-
mục đích
-
producer
-
consumer
-
retry/DLQ
Core tạo queue và cấp quyền
12.5. Checklist DB & Queue
Database:
-
Không hardcode kết nối
-
Có migration khi đổi DB
Queue:
-
Queue do Core cấp
-
Có log và retry/DLQ
13.1. Mục tiêu chương
Thiết kế kiến trúc đa database nhằm:
-
Tách logic nghiệp vụ và truy vấn
-
Switch Oracle/MSSQL bằng cấu hình
-
Không sửa service khi đổi DB
-
Áp dụng nguyên tắc SOLID
13.2. Khái niệm / phạm vi áp dụng
Áp dụng cho:
-
Các module hỗ trợ đa DB
-
Các hệ thống cần deploy trên:
-
Oracle
-
SQL Server
13.3. Quy định chính
Nguyên tắc thiết kế
-
Service không phụ thuộc DB
-
Query tách theo dialect:
-
Oracle
-
MSSQL
-
Repository chỉ thực thi SQL
-
Switch DB bằng config:
db.vendor = oracle | mssql
Cấu trúc khuyến nghị
modules/<module>/
controller/
service/
repository/
query/
QueryProvider.java
OracleQueryProvider.java
SqlServerQueryProvider.java
entity/
dto/
Quy định đa DB
-
Không viết SQL trong Service/Controller
-
Không if/else theo DB trong Service
-
Khác biệt DB chỉ nằm ở QueryProvider
-
Dùng named parameters: :param
13.4. Cách thực hiện / quy trình
Khi thay đổi nghiệp vụ
-
Sửa Service
-
Cập nhật query tương ứng trong provider
Khi khác DB
-
Chỉ sửa query trong:
-
OracleQueryProvider
-
SqlServerQueryProvider
-
Không sửa Service
Khi tạo Pull Request
PR phải:
-
Ghi rõ ảnh hưởng
-
Có smoke test trên env tương ứng
13.5. Ví dụ minh họa
Cấu hình
db.vendor = mssql
Hệ thống tự inject:
SqlServerQueryProvider
Ví dụ sai
if (dbType.equals("oracle")) {
// SQL
} else {
// SQL
}
Sai vì logic DB nằm trong Service.
Ví dụ đúng
Service:
queryProvider.getFindAllPlanningSql();
QueryProvider quyết định SQL theo DB.
13.6. Checklist áp dụng
-
Service không chứa SQL
-
Không if/else theo DB trong service
-
SQL nằm trong QueryProvider
-
Query dùng named parameters
-
PR có test trên DB tương ứng

Không có bình luận nào để hiển thị
Không có bình luận nào để hiển thị