xây dựng job đồng bộ dữ liệu bằng java từ 2 bảng (Oracle DB) về 1 bảng log chung
Để xây dựng job đồng bộ dữ liệu từ 2 bảng (Oracle DB) về 1 bảng log chung, mỗi bảng có khoảng 50.000 bản ghi mới mỗi ngày, bạn cần thiết kế giải pháp theo hướng hiệu năng cao, ổn định và tránh trùng lặp. Dưới đây là giải pháp chi tiết:
🎯 Mục tiêu#
Đồng bộ dữ liệu mỗi ngày (hoặc mỗi X phút nếu cần realtime hơn).
Tích hợp dữ liệu từ 2 bảng nguồn vào 1 bảng log chung.
Tránh đồng bộ trùng dữ liệu.
Hiệu suất tốt với khối lượng dữ liệu lớn.
1. Thiết kế cơ sở dữ liệu#
Bảng nguồn:#
Giả sử bạn có:
SOURCE_A(id, data, created_at, ...)SOURCE_B(id, data, created_at, ...)
Bảng log chung:#
LOG_TABLE ( id NUMBER PRIMARY KEY, source_table VARCHAR2(20), -- 'A' hoặc 'B' source_id NUMBER, -- ID của bản ghi từ bảng gốc data CLOB, -- Dữ liệu đồng bộ (tùy theo nhu cầu có thể lưu JSON/XML) created_at DATE, synced_at DATE DEFAULT SYSDATE )
Ràng buộc duy nhất:
ALTER TABLE LOG_TABLE ADD CONSTRAINT uq_source_id UNIQUE (source_table, source_id);
2. Cách đánh dấu bản ghi đã xử lý#
Có 2 cách:
✅ Cách 1: Dùng cột created_at#
Giả sử các bảng
SOURCE_AvàSOURCE_Bđều có cộtcreated_at.Lưu lại thời điểm cuối cùng đã đồng bộ bằng một bảng cấu hình:
SYNC_STATE ( source_table VARCHAR2(20) PRIMARY KEY, last_synced DATE )
✅ Cách 2: Gắn cờ “đã đồng bộ” trong bảng gốc#
Thêm cột
synced_flag CHAR(1)và cập nhật khi đã đồng bộ (Y).Tốt khi bạn có quyền sửa bảng gốc.
3. Giải pháp job đồng bộ (Java hoặc PL/SQL)#
📌 Java Job (Spring Boot hoặc Scheduler đơn giản)#
Các bước:
Đọc thời điểm
last_syncedtừSYNC_STATE.Truy vấn các bản ghi mới từ
SOURCE_AvàSOURCE_B.
SELECT * FROM SOURCE_A WHERE created_at > :last_synced;
Ghi dữ liệu vào
LOG_TABLE, dùng batch insert hoặc streaming nếu cần.Cập nhật
SYNC_STATEvớiMAX(created_at)vừa đồng bộ.Xử lý ngoại lệ/trùng lặp bằng ràng buộc
UNIQUE.
Pseudo-code:
` for (String source : ["A", "B"]) { Timestamp lastSynced = getLastSynced(source);
List<Data> newRecords = query("SELECT * FROM SOURCE_" + source +
" WHERE created_at > ?", lastSynced);
for (Data record : newRecords) {
insert into LOG_TABLE (
source_table, source_id, data, created_at
);
}
update SYNC_STATE set last_synced = max(created_at) of batch;
} `
4. Hiệu năng & mở rộng#
Dùng batch size = 1000~5000 mỗi lần insert.
Cân nhắc dùng Oracle Bulk Insert (JDBC batch) hoặc PL/SQL với FORALL.
Nếu dữ liệu lớn, bạn có thể nén hoặc lưu dạng JSON ở cột
data.
5. Tùy chọn mở rộng#
Ghi log vào Kafka để có thể xử lý async.
Gửi alert nếu số bản ghi giảm bất thường.
Tạo dashboard theo dõi số lượng log được đồng bộ mỗi ngày.
✅ Kết luận#
| Thành phần | Gợi ý |
|---|---|
| Loại job | Java Scheduler / PL/SQL Job |
| Điều kiện lọc | Dựa trên created_at hoặc synced_flag |
| Xử lý trùng | Ràng buộc UNIQUE (source_table, source_id) |
| Hiệu năng | Batch insert + chỉ xử lý dữ liệu mới |
| Lưu trạng thái | Bảng SYNC_STATE để track tiến độ |