Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠内存管理_Java_Hibernate_Memory Management - Fatal编程技术网

Java 休眠内存管理

Java 休眠内存管理,java,hibernate,memory-management,Java,Hibernate,Memory Management,我有一个使用hibernate的应用程序。有一部分我试图检索文档。每个文档都有一个帐号。模型的外观如下所示: private Long _id; private String _acct; private String _message; private String _document; private String _doctype; private Date _review_date; 然后,我使用文档服务检索文档。代码的一部分如下所示: public L

我有一个使用hibernate的应用程序。有一部分我试图检索文档。每个文档都有一个帐号。模型的外观如下所示:

    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
                    }
public List getDocuments(int-hours,int-dummyFlag,List-accts){
列表文档=新建ArrayList();
会话=空;
标准=空;
试一试{
//让我们通过减去
//几个小时过去了。
session=HibernateUtil.getSession();
session.beginTransaction();
如果(科目==null){
日历截止时间=Calendar.getInstance();
截止时间。添加(Calendar.HOUR\u OF_DAY,hours\u);
条件=session.createCriteria(Doc\u table.class)。添加(
Restrictions.gt(“dbcreate_date”,cutoffTime.getTime()))
.add(Restrictions.eq(“dummyflag”,dummyflag_));
}否则
{criteria=session.createCriteria(Doc_table.class).add(Restrictions.in(“acct”,accts));
}
documents=criteria.list();
对于(int x=0;x
如果检索少量文档,这种方法非常有效。但是当文档大小较大时,我会出现堆空间错误,可能是因为文档占用了大量空间,而当检索数千个文档时,会发生不好的事情

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

但在这种情况下,我感到很困惑。我想我正在寻找一种方法,在这种方法中,我只需返回
Doc\u表
对象的帐号即可


或者,通过某种方式,我可以使用符合我的条件的hibernate从数据库中一次检索一个文档(而不是返回使用过多内存的整个对象列表)。

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

  • 以较小的大小批量加载文档
  • (您注意到的方式)不查询单据,只查询账号:

    List accts=session.createQuery(“选择d.。_ACCTfrom Doc d WHERE…”)

List accts=session.createCriteria(Doc.class)。
setProjection(Projections.property(“\u acct”))。
list();
  • 当文档类中有一个特殊字段包含大量文档字节数据时,可以将该特殊字段映射为延迟加载字段
  • 创建第二个仅包含所需字段的实体类(只读),并将其映射到同一个表

与其一次获取所有文档,即所有记录,不如尝试限制获取的行数。此外,部署一种策略,在这种策略中,您可以将文档临时存储为平面文件,稍后再获取或在使用后删除。虽然这是一个有点长的过程,但它是从数据库处理和传递文档的有效方法。

我有点一个新手进入休眠状态,所以我不知道如何使用投影。它就像一个符咒。只是一个后续问题,如果你想检索多个字段怎么办。投影语法如何工作?@Elliott:List results=session.createCriteria(Doc.class).setprojections(projections.projectionList().add(projections.property(“\u acct”))。add(Projections.property(“其他”)).list();--如果您还有更多问题,请创建一个新问题。
 List<String> accts = session.createCriteria(Doc.class).
             setProjection(Projections.property("_acct")).
             list();