繁体   English   中英

Hibernate事务对内存的影响

[英]Memory impact of Hibernate transactions

我正在使用JAX-RS Web应用程序,该应用程序将完整的文件夹内容读入数据库。 该文件夹中的文件可能很大(+ -100Mb)。 JAXB用于将xml解组为Java对象。 这些对象使用Hibernate持久化到数据库中。

为了避免对内存造成影响,我决定不将完整文件的内容保留在内存中,而是使用流技术分别处理每个对象。

另一个要求是该文件夹是事务处理的。 因此,如果其中一个xml中发生错误,则将完整的文件夹内容移至错误文件夹,并回滚已经添加到数据库中的元素。

现在我的问题与休眠的内存管理有关。 由于真正的提交是在最后完成的(在使用实体管理器将所有元素都持久保存到数据库之后),休眠状态是否始终将数据真正提交到内存中? 如果是这样,我在文件夹中的文件流传输方面是否具有任何优势,还是因为在提交数据库之前,Spring事务将所有元素都保留在内存中,所以它完全没有用吗?

如果您想在Hibernate中以这种方式进行流式传输,可以做几件事。

  • 定期清除会话缓存。 您可以清除内存中高速缓存的内容,方法是先将它们刷新到数据库,然后再清除它们。 要记住的一件事是,一旦您从一级缓存中清除了某些内容,就无法再使用它(例如,您无法持久保存对象,将其清除,然后将该对象添加到一个-以后有很多关联)。 这是一个简单的示例,每次都会清除缓存。 这有点太简单了,实际上,您可能想每50个左右项目清除一次缓存,以免您不刷新每条记录(可能会导致性能问题)。

Transaction tx = session.beginTransaction();

try {
    while(...) {
        processNextRecord(session);
        session.flush();
        session.clear();
    }
    tx.commit();
} catch (Exception ex) {
    tx.rollback();
} 
  • 使用无状态会话。 Hibernate中的StatelessSession对象允许您以类似于Session接口但略有不同的方式来操纵数据库(持久化,修改,删除实体等)。 例如,不考虑级联,必须显式调用update等。好处是无状态会话不会在内存中存储任何内容。

有关所有这些的详细说明,请查看Hibernate的批处理文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM