Hibernate内存管理

Ell*_*ott 3 java hibernate memory-management

我有一个使用hibernate的应用程序.在一个部分我试图检索文件.每个文档都有一个帐号.该模型看起来像这样:

    private Long _id;
private String _acct;  
private String _message;  
private String _document;    
private String _doctype;  
private Date _review_date;  
Run Code Online (Sandbox Code Playgroud)

然后我用文档服务检索文档.代码的一部分在这里:

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
                    }
Run Code Online (Sandbox Code Playgroud)

如果我正在检索少量文档,这非常有用.但是当文档大小很大时,我会收到堆空间错误,可能是因为文档占用了大量空间,而当你检索数千个空间时,会发生不好的事情.

我真正想做的就是检索符合我标准的每个文档,获取帐号并返回一个帐号列表(一个比对象列表小得多的对象).如果这是jdbc,我会知道该怎么做.

但在这种情况下,我很难过.我想我正在寻找一种方法,我可以带Doc_table回来获取对象的帐号.

或者,某种方式我可以使用符合我标准的hibernate从数据库中一次检索一个文档(而不是带回使用太多内存的整个对象列表).

Ral*_*lph 6

有几种方法可以解决这个问题:

  • 以较小的批量加载文档
  • (您注意到的方式)不要查询文档,而只查询帐号:

    列出accts = session.createQuery("SELECT d._acct FROM Doc d WHERE ...");

要么

 List<String> accts = session.createCriteria(Doc.class).
             setProjection(Projections.property("_acct")).
             list();
Run Code Online (Sandbox Code Playgroud)
  • 如果Document类中包含大量Document字节数据,则可以将此特殊字段映射为Lazy loaded字段.
  • 创建第二个实体类(只读),它只包含您需要的字段并将其映射到同一个表