Tôi sẽ đề xuất xếp hàng tất cả các hành động SQL từ nhiều luồng trong một số cấu trúc dữ liệu trung gian, và sau đó đưa vào cơ sở dữ liệu từ một luồng duy nhất. Có thể có các cấu trúc trung gian an toàn cho luồng như ConcurrentHashMap
, ConcurrentLinkedQueue
hoặc bạn có thể chỉ đồng bộ hóa khi làm việc với nó.
Bằng cách này, bạn thậm chí không cần bắt đầu giao dịch trước. Dữ liệu đang chờ xử lý có thể kém an toàn hơn, nhưng tôi cho rằng chúng không an toàn hơn nhiều trong cơ sở dữ liệu khi giao dịch chưa được cam kết.
Tất nhiên, điều này chỉ có thể hoạt động nếu bạn không có select
câu lệnh chọn dữ liệu giao dịch không được cam kết từ cùng một giao dịch. Loại bỏ các truy vấn như vậy theo cách này hay cách khác có thể yêu cầu thiết kế lại.
Sử dụng CountDownLatch
để phát hiện khi nào tất cả dữ liệu đã sẵn sàng và luồng ghi cơ sở dữ liệu sẽ bắt đầu hành động của nó. Nếu không bao giờ xảy ra, hãy sử dụng mẫu lò phản ứng cho luồng ghi cơ sở dữ liệu.