Hibernate只读实体表示通过删除数据库快照来节省内存

时间:2018-04-21 12:23:20

标签: java hibernate jdbc

在浏览hibernate文档并阅读只读实体时,以下hibernate official documentation说,

Hibernate对只读实体进行了一些优化:

  • 通过不检查简单属性或单端关联来节省执行时间。
  • 通过删除数据库快照来节省内存。

我不明白deleting database snapshots是什么意思。

它是指数据库中发生的一些优化吗?如果是这样,hibernate如何通知/提示数据库进行优化?此优化是否是特定于数据库的功能,因此无法保证数据库的安全性?

或者它是指在hibernate库中发生的优化?我怀疑是这种情况,因为它是否是readOnly或者hibernate为获取记录而触发的查询是相同的,但是想确保我在这里没有遗漏任何东西。

更新:根据@tgdavies的回答,它有助于休眠不保留快照,因为不需要进行脏检查。 随后想了解JDBC readOnly和hibernate readOnly之间是否存在任何链接以启用db优化。根据它所说的Connection.html#setReadOnly - Puts this connection in read-only mode as a hint to the driver to enable database optimizations.。那些提示是什么?

有人可以说明如何实现这种优化。

1 个答案:

答案 0 :(得分:1)

当Hibernate将对象加载到Session中时,它会创建对象当前数据库状态的状态快照,以便它可以对快照执行脏检查。

由于永远不会修改只读对象,因此不需要此快照,可以保存内存。

这不是与数据库访问相关的优化,而是减少会话使用的内存。

我怀疑Hibernate将JDBC连接设置为只读 - Hibernate不知道Session中还会发生什么。您可以记录SQL Hibernate发送的SQL以确保:How to log final SQL queries with hibernate

我不确定数据库可以在只读连接上执行哪些优化 - 可能在某些隔离模式下占用更少的锁,但这只是我挥手。