Tôi đang gặp một số sự cố khi biết truy vấn HQL
nhận thông tin từ đó. Dự án của tôi đang sử dụng các luồng khác nhau và mỗi luồng đọc/ghi vào cơ sở dữ liệu. Chủ đề không chia sẻ đối tượng Phiên, thay vào đó tôi đang sử dụng lớp học HibernateUtil
tạo phiên cho tôi.Hibernate HQL chỉ truy cập bộ nhớ cache phiên
Cho đến gần đây, tôi sẽ chỉ đóng một phiên sau khi viết chứ không phải sau khi đọc. Thay đổi đối tượng sẽ được nhìn thấy ngay lập tức trong cơ sở dữ liệu nhưng khi đọc trên các chủ đề khác (đối tượng phiên khác với đối tượng được sử dụng để viết), tôi sẽ nhận được thông tin cũ. Đọc và viết xảy ra luôn luôn trên các chủ đề khác nhau có nghĩa là các đối tượng Session khác nhau và các bộ đệm phiên khác nhau. Tôi luôn luôn nghĩ rằng bằng cách sử dụng HQL
thay vì Criteria
, tôi sẽ luôn nhắm mục tiêu cơ sở dữ liệu (hoặc bộ nhớ cache cấp thứ hai) và không phải là bộ nhớ cache phiên nhưng trong khi gỡ lỗi mã của tôi, nó đã được làm rõ với tôi rằng HQL đang tìm kiếm đối tượng trong bộ nhớ cache phiên và truy lục đối tượng cũ đã lỗi thời.
Tôi có sai khi giả định rằng HQL
luôn nhắm mục tiêu cơ sở dữ liệu không? Hoặc ít nhất là bộ nhớ cache cấp thứ hai?
PS: Tôi chỉ đang sử dụng một đối tượng SessionFactory
.
vì vậy lần đầu tiên đối tượng phiên của tôi thực hiện truy vấn HQL nó nhắm mục tiêu đến db. kết quả sau đó được lưu trữ trong bộ nhớ cache phiên. sau đó lần thứ hai tôi thực hiện cùng một truy vấn HQL, nó đọc bộ nhớ cache thay vì nhắm mục tiêu cơ sở dữ liệu. Đây là hành vi mặc định. tôi đã hiểu điều này một cách chính xác chưa? ** ps: ** thực sự, các phiên kết thúc sau mỗi lần đọc và ghi (các đối tượng 'Session' ngắn ngủi) giải quyết được vấn đề của tôi. – alegen
@alegen: HQL sẽ được chạy dựa vào cơ sở dữ liệu * mỗi lần *, nhưng các đối tượng Java là kết quả cuối cùng của truy vấn đó có thể đến từ bộ nhớ cache phiên. Đây là hành vi mặc định. – skaffman
bạn có một ngày tuyệt vời! Cảm ơn bạn cho câu trả lời của bạn :) – alegen