Có vẻ như các truy vấn db của bạn được chạy từ chuỗi giao diện người dùng mặc dù bạn nói rằng một tác vụ đã lên lịch chạy các truy vấn (?). Để chắc chắn, bạn có thể in ra một stacktrace nơi bạn truy cập cơ sở dữ liệu:
new Exception().printStacktrace();
Chuyển sang giải pháp được đề xuất của bạn:nó có vẻ là một thiết kế phù hợp nếu các truy vấn db của bạn chậm và nếu không sẽ đóng băng giao diện người dùng của bạn. Bạn có thể triển khai hệ thống sự kiện giữa lớp giao diện người dùng và lớp db, có lẽ là một cách tiếp cận dựa trên hàng đợi đơn giản.
CHỈNH SỬA:
Rất có thể có những ví dụ để tìm cách triển khai giải pháp dựa trên sự kiện.
Tuyên bố từ chối trách nhiệm:Tôi đã không thực hiện bất kỳ lập trình giao diện người dùng thực nào trong nhiều năm.
- Người dùng nhấp vào một nút trong giao diện người dùng. Chuỗi giao diện người dùng đặt một đối tượng sự kiện (DataWANTEvent) vào hàng đợi (java.util.Queue), thay đổi nhãn ("Đang chờ dữ liệu ..."), sau đó tiếp tục và đợi các tương tác khác của người dùng.
- Luồng lớp db nhận dạng sự kiện làm hàng đợi và truy vấn cơ sở dữ liệu. Kết quả được đăng lại trên một hàng đợi khác trong một đối tượng kết quả.
- Một chuỗi giao diện người dùng (có thể không phải là chuỗi chính) lấy đối tượng kết quả từ hàng đợi kết quả và cập nhật giao diện người dùng.
Có thể không cần một hàng đợi để đăng các đối tượng kết quả trở lại giao diện người dùng. Một phương thức cập nhật có thể được gọi trực tiếp.
Nếu người dùng nhấp vào nút hủy, sự kiện cập nhật / lệnh gọi lại có thể bị bỏ qua hoặc nếu có thể, truy vấn db có thể bị hủy.