我正在使用hibernate criteria API来检索数据。这些数据将由用户查看。用户无法修改这些数据。那么,使用readOnly有什么好处吗?你能建议专业人士吗?利弊?我还需要考虑其他措施吗?
答案 0 :(得分:12)
Hibernate正在跟踪会话中加载的所有对象,以查找修改并在刷新会话时保留所有更改。如果以只读方式加载实体,则指示Hibernate不跟踪该实体的更改。这样,您将获得一些性能提升。
但是,该对象将保留在会话缓存中。如果缓存太大,它将成为一个很大的问题,同时也存在内存不足的风险。如果您阅读了许多物体,那么将它们赶走是很好的。
如果Hibernate的性能确实存在问题,那么切换到纯JDBC是一个更好的选择。我从不使用Hibernate来加载大量数据(例如报表或批处理)。为了显示列表,我只加载我需要的字段,而不是整个实体(如果只读取所选字段,而不是整个实体,它们总是只读)。
所以答案是,是,它会让Hibernate更快一些,但还有其他方法可以获得更高的性能。
答案 1 :(得分:2)
使用只读实体更像是意图的表达式。通过使用只读,hibernate将不会检查实体是否已更改,即使它已更改。这与标记为不可变的实体不同,因为它们被防止变更。如果Hibernate检测到不可变实体对象的属性已更改,则会出错,但对于只读实体则不然。
因此,将实体设为只读只是告知hibernate您不希望更改持续存在。在相关集合的情况下,这可能也不是真的。
除非您有特殊要求或进行特殊的昂贵肮脏检查,否则性能提升很小。
所以这不是关于表现。这是一种安全措施,可以保护您的数据库免受对对象的意外更改。
例如,您有一个描述地理位置的Location实体。现在你有了一个人并为其分配了一个位置。使用人员协会加载位置时,您可以将位置设置为只读,即使您的同事(或您自己)意外地意外更改了位置。不会存储更改,但仍将对Person实体进行更改。 (最好将位置标记为不可变,但是在极少数情况下这是不够的。)