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从数据库中一次检索一个文档(而不是带回使用太多内存的整个对象列表).
有几种方法可以解决这个问题:
(您注意到的方式)不要查询文档,而只查询帐号:
列出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)
归档时间: |
|
查看次数: |
1437 次 |
最近记录: |