簡體   English   中英

經常關閉和打開hibernate會話是一個好主意嗎?

[英]Is it a good idea to close and open hibernate sessions frequently?

我正在開發一個應用程序,它要求以頻繁的間隔或觸發器從數據庫中讀取實體狀態。 但是,一旦hibernate讀取狀態,它就不會重新讀取它,除非我明確關閉會話並在新會話中讀取實體。

每次我想要讀取實體然后關閉它時打開一個會話是一個好主意嗎? 這會給應用程序和數據庫帶來多少開銷(我們也使用c3p0連接池)?

在再次閱讀之前簡單地從會話中逐出實體是否足夠?

您還可以使用refresh來重新加載實體。 evictclear ,由@Bozho提及。

使用連接池,打開和關閉會話的開銷並不大。 需要時間的是構建會話工廠。

關閉並重新打開會話的問題是,如果我記得很清楚,已經加載的對象仍然會分離。 對於延遲加載,這可能是有問題的。 所以最好保持會話開放並使用evictclearrefresh

請注意,如果您逐出實體,並且訪問已加載的一個此類實體,您仍將獲得舊數據。

MyEntity e = session.load( ... );
...
session.evict(e);         // remove entity from the cache
String p = e.myProperty;  // still the value at the time it was loaded
e = sesssion.load( ... ); // latest value

在您的情況下,最好引入一個設計指南,表明無論何時操作實體,都應該首先刷新它。

MyEntity e = session.load( ... );
...
session.refresh( e );     // refresh entity and cache
String p = e.myProperty;  // latest value
e = sesssion.load( ... ); // latest value

上面的代碼只是偽代碼,我沒有檢查過。

請注意,如果會話打開一段時間,緩存可能會增長,在這種情況下,您可能仍希望clear它。 一般來說,最好保持會話簡短以防止緩存增長問題,加上連接超時,事務超時和鎖爭用問題。

是。 evict()對象。 如果要清除整個會話,請clear()它。

新會話應與請求(線程)或長時間運行的會話相關聯。

對於鏈接到其他表的列,如果將fetchtype設置為LAZY,則在明確要求之前,Hibernate不會加載該數據。 這節省了大量時間。

Table的列可以標記為:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="other_table_id", nullable = false)
private OtherTable otherTable;

因此,直到你執行類似Table.getOtherTable().getValue()的操作OtherTable Table.getOtherTable().getValue()才會將OtherTable加載到會話中。 因此,如果你不做某些事情,你也不需要驅逐它。

請注意,這是偽編碼,可能會對您的程序有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM