如果您有理由繼續使用有狀態的Session
,您可以考慮使用StatelessSession
。
回調接口
你的DAO類,允許您提供,旨在接受每個實體在列表中,一個接一個的回調接口的實現揭露的方法。
public interface EntityCallback<T> {
boolean doWithEntity(T entity);
}
這裏的想法是,你的服務層可以調用上述接口實現一個DAO方法如下:
public <T> void findAll(EntityCallback<T> callback) {
ScrollableResults<T> results = /* get result set*/
int iterations = 0;
while(results.hasNext()) {
iterations++;
T entity = results.next();
if(!callback.doWithEntity(entity)) {
break;
}
if(iterations % 100 == 0) {
session.clear();
iterations = 0;
}
}
results.close();
}
上述方法的好處是,它可以防止泄露任何休眠專用持久性構造到服務層,而不實際將業務邏輯推入數據訪問層。
裹的ScrollableResults Autoclosable資源
可能有次它可能只是簡單迭代在事務內的服務層的結果。通過在類的周圍創建一個包裝,你可以利用試用資源。
public class QueryResult<T> implements Iterator<T>, AutoCloseable {
/* add implementation stuffs */
}
然後,服務層裏面,你可以用它如下:
try(Iterator<Entity> it = dao.iterator(...)) {
while(it.hasNext()) {
Entity entity = it.next();
}
}
很像findAll(EntityCallback<T>)
方法是如何保持迭代次數的跟蹤,你QueryResult
類可以做相同的基於每次打電話給next()
,因此可以按特定間隔自動清除會話。
試用資源方法的好處是,因爲它使用JDK7的AutoCloseable
接口,服務層可以簡單地將它用作迭代器,而不必關心底層結果集並關閉它。
看起來你可以嘗試[StatelessSession](https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/StatelessSession.html)作爲無狀態會話不實現第一級緩存和與「會話」相比,重量輕。雖然它有一些限制,如鏈接中指定的 –
您可以粘貼一段代碼片段或示例或鏈接以供參考嗎? – Kathiresa
請參閱** [無狀態會話]的第13.3節**(https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html) –