Tôi vừa thử nghiệm ứng dụng của mình theo profiler và phát hiện ra rằng chuỗi sql sử dụng khoảng 30% bộ nhớ của tôi! Đây là kỳ quái.Hibernate tạo ra các SQL khác nhau cho mỗi truy vấn
Có rất nhiều chuỗi như thế này được lưu trữ trong bộ nhớ ứng dụng. Đây là các truy vấn SQL được tạo bởi hibernate, lưu ý các số khác nhau và dấu gạch dưới sau:
select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=? for update
select avatardata0_.Id as Id4347_0_,...... where avatardata0_.Id=? for update
Đây là phần tôi không thể hiểu được. Tại sao hibernate phải tạo các chuỗi sql khác nhau với các số nhận dạng khác nhau như "Id4305_0_" cho mỗi truy vấn? Tại sao nó không thể sử dụng một chuỗi truy vấn cho tất cả các truy vấn giống nhau? Đây có phải là một số loại lừa để bỏ qua truy vấn bộ nhớ đệm?
Tôi sẽ đánh giá rất cao nếu ai đó mô tả cho tôi lý do tại sao điều đó xảy ra và cách tránh lãng phí tài nguyên đó.
CẬP NHẬT
Ok. Tôi tìm thấy nó. Tôi đã sai giả định rò rỉ bộ nhớ, Đó là lỗi của tôi. Hibernate đang hoạt động như dự định.
Ứng dụng của tôi đã tạo 121 (!) SessionFactories trong 10 chủ đề, chúng tạo ra khoảng 2300 bản sao của SingleTableEntityPersisters. Và mỗi SingleTableEntityPersister tạo ra khoảng 15 truy vấn SQL với các định danh khác nhau. Hibernate đã buộc phải tạo ra khoảng 345.000 truy vấn SQL khác nhau. Mọi thứ đều ổn, không có gì lạ :)
Nó có thể hữu ích nếu bạn có thể cung cấp một cấu hình bản đồ đơn giản, mã kiểm tra và DDL bảng đơn giản mà tái tạo tình trạng này. Theo kinh nghiệm của tôi, tôi chưa bao giờ thấy Hibernate tạo ra chỉ số bí danh cột cao như vậy. –
Điểm tốt. Tôi sẽ thử vào ngày mai. :) –
@AndrewFrolov: Hy vọng câu trả lời của tôi phù hợp với câu hỏi tốt hơn ngay bây giờ, với các cập nhật của bạn.Trong mọi trường hợp vui mừng bạn đã tìm thấy và khắc phục vấn đề! – ManuPK