2011-10-04 10 views
10

Tôi có 2 máy chủ vật lý mà lượt truy cập ứng dụng web của tôi được quản lý bởi bộ cân bằng tải. Tôi luôn luôn nhận được -org.hibernate.LazyInitializationException: không thể khởi tạo proxy - không có phiên

org.hibernate.LazyInitializationException: không thể khởi tạo proxy - không có phiên

khi một trong những máy chủ được nhấn trong khi người kia chạy trơn tru mà không cần bất kỳ vấn đề. Tôi có một cửa hàng bộ nhớ cache được quản lý cục bộ được bật và quản lý bởi ứng dụng. Ngoại lệ này chỉ xảy ra khi cố truy cập một cột cụ thể từ một bảng. Phần còn lại của các hoạt động hoàn toàn tốt đẹp bất kể máy chủ nào bị tấn công.

Làm lười = false sẽ trở thành vấn đề về hiệu suất vì số lượng hàng trên bảng đó khá lớn. Và bằng cách này, chúng tôi đang sử dụng get (đối tượng) trên phiên thay vì tải (đối tượng).

Trả lời

5

Đối tượng của bạn bị tách rời. Bạn cần phải gắn nó vào phiên hiện tại trước khi truy cập nó:

session.update(object); 

Ngoài ra hãy chắc chắn rằng bạn truy cập vào nó trong một giao dịch

Tìm hiểu thêm về vấn đề/giải pháp here

10

Nghe có vẻ như cột bạn đang cố gắng truy cập được cấu hình như một kết hợp của một số sắp xếp trong thực thể của bạn (OneToMany, ManyToOne, bất kỳ điều gì) và bạn không điền vào liên kết đó trong DAO của bạn. Sau đó, khi bạn cố gắng truy cập vào cột đó (trong một vị trí trong mã của bạn mà không có phiên Hibernate), nó không có dân cư, Hibernate cố gắng tải nó và phát triển.

Vì bạn đang thực tế sử dụng dữ liệu trong liên kết đó, làm cho nó EAGER giống như âm thanh mà bạn thực sự muốn làm. Và nếu bảng đó quá lớn, bạn nên xem xét lập chỉ mục nó để các truy vấn chống lại nó có hiệu quả.

+0

Tôi có vấn đề tương tự nhưng khi tôi sử dụng kiểu tìm nạp mong muốn tôi gặp phải sự cố khác: hibernate cố thêm đối tượng của tôi vào PersistentSet trước khi trường được sử dụng để triển khai hashcode/equals được khởi tạo. Trong mã của tôi, tôi có một ngoại lệ được ném nếu điều đó xảy ra do đó nó không thành công (phương pháp hashcode sẽ bị vi phạm nếu không). Bất kỳ ý tưởng làm thế nào để sửa chữa nó? –

+0

Có một số vấn đề. Bạn nói 'và bạn không điền vào liên kết đó trong DAO của bạn'. làm thế nào chính xác là đạt được? –

0

Đó có phải là liên kết hoặc thuộc tính - nếu đó là thuộc tính thì vấn đề có thể là một trong các máy chủ đang chạy phiên bản không được thiết kế.

Lazy attribute fetching: an attribute or single valued association is fetched when the instance variable is accessed. This approach requires buildtime bytecode instrumentation and is rarely necessary. 
12

Từ các thẻ bạn đã cung cấp, tôi cho rằng bạn đã gặp sự cố này khi sử dụng Spring Framework. Tôi chạy vào cùng một LazyInitializationException trong khi sử dụng Dữ liệu mùa xuân org.springframework.data.jpa.repository.JpaRepository.

Tôi đã giải quyết sự cố bằng cách chú thích phương pháp sử dụng gián tiếp Hibernate để truy xuất dữ liệu từ cơ sở dữ liệu với @Transactional.