Java 休眠内存管理
我有一个使用hibernate的应用程序。有一部分我试图检索文档。每个文档都有一个帐号。模型的外观如下所示: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
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();
- 当文档类中有一个特殊字段包含大量文档字节数据时,可以将该特殊字段映射为延迟加载字段
- 创建第二个仅包含所需字段的实体类(只读),并将其映射到同一个表
List<String> accts = session.createCriteria(Doc.class).
setProjection(Projections.property("_acct")).
list();