2011-01-26 76 views
3

我有一個使用休眠的應用程序。在一部分我試圖檢索文件。每份文件都有一個帳號。模型看起來是這樣的:休眠內存管理

private Long _id; 
private String _acct; 
private String _message; 
private String _document;  
private String _doctype; 
private Date _review_date; 

然後我用文檔服務檢索文檔。代碼的一部分是在這裏:

public List<Doc_table> getDocuments(int hours_, int dummyFlag_,List<String> accts) { 
     List<Doc_table> documents = new ArrayList<Doc_table>(); 
    Session session = null; 
    Criteria criteria = null; 
    try { 
     // Lets create a previous Date by subtracting the number of 
     // subtractHours_ passed. 
     session = HibernateUtil.getSession(); 
     session.beginTransaction(); 
     if (accts == null) { 
      Calendar cutoffTime = Calendar.getInstance(); 
      cutoffTime.add(Calendar.HOUR_OF_DAY, hours_); 
      criteria = session.createCriteria(Doc_table.class).add(
        Restrictions.gt("dbcreate_date", cutoffTime.getTime())) 
        .add(Restrictions.eq("dummyflag", dummyFlag_)); 
     } else 
     { criteria = session.createCriteria(Doc_table.class).add(Restrictions.in("acct", accts)); 
     } 
     documents = criteria.list(); 
     for (int x = 0; x < documents.size(); x++) { 
      Doc_table document = documents.get(x); 
       ......... more stuff here 
        } 

這如果我獲取少量的文檔的偉大工程。但是,當文件大小很大時,我得到一個堆空間錯誤,可能是因爲文件佔用大量空間,而當您檢索數千個文件時,會發生不好的事情。

我真正想要做的就是檢索符合我的標準的每個文檔,獲取帳號並返回一個帳號列表(一個比對象列表小得多的對象)。如果這是jdbc,我會確切知道該怎麼做。

但在這種情況下,我很難過。我想我正在尋找一種方法,讓我可以將Doc_table對象的帳號恢復。

或者,我可以使用適合我的標準的hibernate從數據庫一次檢索一個文檔(而不是將整個使用太多內存的對象列表回收)。

回答

6

有幾種方法來解決這一問題:

  • 加載文檔中的更小尺寸的批量
  • (這就是你注意到)不來查詢該文檔,但只適用於帳戶號碼:

    列表accts = session.createQuery(「SELECT d._acct FROM Doc d WHERE ...」);

List<String> accts = session.createCriteria(Doc.class). 
      setProjection(Projections.property("_acct")). 
      list(); 
  • 當在你的文件,包含了大量文件的字節數據類專業,那麼你可以這個特殊字段映射爲一個懶加載領域。
  • 創建僅包含您需要,並將其映射到同一個表
+0

我是Hibernate的新手,所以我不知道如何使用投影。它像一個魅力。只是一個後續問題,如果您想要檢索多個字段,該怎麼辦?投影語法如何工作? – Elliott 2011-01-26 18:15:37

0

而是獲取所有文件的IE瀏覽器,同時所有記錄的字段的第二個實體類(只讀),儘量限制行被抓取。此外,部署一種策略,您可以將文檔臨時存儲爲平面文件,稍後提取或在使用後刪除。雖然它有一點長的過程,它是從數據庫中處理和交付文檔的有效方式。