2011-01-26 90 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浏览器,同时所有记录的字段的第二个实体类(只读),尽量限制行被抓取。此外,部署一种策略,您可以将文档临时存储为平面文件,稍后提取或在使用后删除。虽然它有一点长的过程,它是从数据库中处理和交付文档的有效方式。