2013-09-30 31 views
5

JPA ile hibernate 4.2.4 kullanıyorum ve ManyToMany bir dernekte layz yükleme kullanıyorum. Object A, @ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY) ve contrariwise ile ilişkilidir. Aşağıdaki (basitleştirilmiş) kodu diyoruz veritabanından veri almak için: başvurum oturumu hala ilk çağrıdan sonra ihtiyaç duyulan bazı tembel yükleme yapmak gerekiyorsa tembel yükleme ile hazır oturum oturum açma

try { 
    session = cutSessionFactory.openSession(); 
    session.beginTransaction(); 
    List<IBO> result = session.createQuery(query).list(); 
    session.getTransaction().commit(); 
    return result; 
catch{...} 
finally{ 
    session.close; 
} 

Başlangıçta Açık bağlantıyı izin verirdi neden olur. Ancak bu, bazı eylemlerden sonra uygulamamın dondurulmasını sağlarken, önceki stratejiye geçtim. Şimdi her şey çalışıyor; donma yok, tembel yükleme ile sorun yok. Bazı çocuk babasıdır bir varlık, yüklerseniz Ama (o tembel yükleme requieres) günlük diyor ki:

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

O oturumu kapatmadan değildir hazırda bekleme mantıklı

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: [email protected] 
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out 

ardından (aslında yeni bir oturum kullanan tembel yükleme için yeni bir istek olduğunu düşündüm) bir bağlantı havuzu kullanılmayan bir oturum olduğunu kabul eder. Ama sonunda hazırda bekletmek benim "kötü oturum işleme" düzeltiyor.

Tembel yükleme ile kullanılan oturumları işlemek için daha iyi bir yöntem bilen var mı?

+0

u bir buldunuz Cevap? Bu uyarıyı gördüğünüzde, bağlantı (c3p0'dan) kapalı mı? ya da bir bağlantı havuzu sızıntısı var mı? – OhadR

cevap

0

Tabii ki oturumu kapatmamız gerekiyor, aksi takdirde uygulama düzgün çalışmayabilir. Ayrıca, daha iyi performans için yuvalanmış nesneyi tembel tutmaya ve zorunlu katılımları eklememeye çalışmalıyız.

Eğer tembel nesne örneğin yüklenen alacak, böylece sorguda katılmak uygulamak zorunda çocuk eleman erişmek gerekirse:

class A{ 
     B b; 
} 

sql:

select * from A Left join B on A.bid = B.id