Tôi đang phát triển ứng dụng Java/Seam/Hibernate/Glassfish với hai luồng:
- Chủ đề số 1 Gửi nhiều tin nhắn khác nhau và viết thông tin tóm tắt vào cơ sở dữ liệu MySQL.
- Chủ đề số 2 Định kỳ thăm dò cơ sở dữ liệu (bằng cách
Dịch vụ thực thi theo lịch trình
Called) và hoạt động theo "trạng thái" hiện tại của mỗi tin nhắn.
Gặp phải vấn đề kiểm tra tích hợp:Chủ đề số 2 Chờ đợiChủ đề số 1 Việc thêm hàng mới dường như không thành vấn đề, chỉ là hàng mới không được thêm trong quá trình thử nghiệm nên lệnh gọi dự kiến đã không được thực hiện. Chắc chắn rồi, sau khi thử nghiệm thất bại, một dòng mới hiện lên - nhưng đã quá muộn. Không chắc đây có phải là vấn đề thiết kế hay không - Chủ đề số 2 hiện đang được sử dụng Lifecycle.beginCall()...Lifecycle.endCall()
Lấy bối cảnh Seam. Vì vậy, sự hiểu biết của tôi (có thể sai) có thể là vấn đề là do hai luồng có hai phiên Hibernate riêng biệt - vì vậy một lần đọc không biết thông tin mới nhất của một lần viết?
Có thể có nhiều cách khác nhau để giải quyết vấn đề này, nhưng ý tưởng hiện tại của tôi là khi tôi gọi cứu()
/tuôn ra()
Ngay cả khi thực hiện giao dịch theo cách thủ công, tôi không thể buộc Hibernate thực sự thêm bản ghi vào bảng ngay lập tức phải không? Không gặp may mắn với những điều này - khiến tôi tự hỏi liệu có loại giao dịch được quản lý nào đó đang được sử dụng ở hậu trường hay không. Cảm ơn vì lời khuyên nào...
Để biết thông tin, đây là ý chính của mã để thêm bản ghi:
// Lấy phiên Hibernate
Phiên phiên = (Phiên) Component.getInstance("hibernateSession");
//Tạo yêu cầu
Yêu cầu newRequest = Yêu cầu mới();
// newRequest.set();
// Lưu yêu cầu mới vào cơ sở dữ liệu
session.save(newRequest);
// Đã thử session.flush(), giao dịch.commit(), v.v. tại đây.
// Dường như không có gì đưa bản ghi vào cơ sở dữ liệu ngay lập tức.
Không chắc điều này có liên quan hay không, nhưng đây là cấu hình Hibernate:
đúng
after_statement
org.hibernate.transaction.SunONETransactionManagerLookup
org.hibernate.transaction.JTATransactionFactory
jta
(Vì đây là ứng dụng hiện có do khách hàng sở hữu nên tôi không có quyền thay đổi cấu hình Hibernate.)
Suy đoán của bạn là tốt.
bạn đang sử dụngNhà máy giao dịch JTA
, do đó giao dịch được chia cho JTA (tức là vùng chứa).
để tiết kiệm Lời yêu cầu
Phương thức (ở đây tôi giả sử nó được định nghĩa trong EJB) cần được chú thích bằng các chú thích giao dịch:@TransactionAttribution(TransactionAttributionType.REQUIRES_NEW)
, vì vậy khi phương thức kết thúc, giao dịch sẽ được thực hiện.
Tôi là một lập trình viên xuất sắc, rất giỏi!