Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate标准中使用readOnly是否有任何性能优势?_Java_Hibernate - Fatal编程技术网

Java 在hibernate标准中使用readOnly是否有任何性能优势?

Java 在hibernate标准中使用readOnly是否有任何性能优势?,java,hibernate,Java,Hibernate,我正在使用hibernate标准API检索数据。用户只需查看这些数据。用户无法修改这些数据。那么,使用readOnly有什么好处吗?你能建议一下利弊吗?我还需要考虑其他的措施吗? Hibernate正在跟踪会话中加载的所有对象,以查找修改,并在刷新会话时保留所有更改。如果以只读方式加载实体,则指示Hibernate不要跟踪该实体的更改。这样,您将获得一些性能提升 但是,对象将保留在会话缓存中。如果缓存太大,它将成为一个严重的pefrormance问题,并且可能会耗尽内存。如果你读了很多东西,最好

我正在使用hibernate标准API检索数据。用户只需查看这些数据。用户无法修改这些数据。那么,使用readOnly有什么好处吗?你能建议一下利弊吗?我还需要考虑其他的措施吗?


Hibernate正在跟踪会话中加载的所有对象,以查找修改,并在刷新会话时保留所有更改。如果以只读方式加载实体,则指示Hibernate不要跟踪该实体的更改。这样,您将获得一些性能提升

但是,对象将保留在会话缓存中。如果缓存太大,它将成为一个严重的pefrormance问题,并且可能会耗尽内存。如果你读了很多东西,最好把它们逐出

如果Hibernate的性能确实是个问题,那么切换到纯JDBC是一个更好的选择。我从不使用Hibernate加载大量数据(例如用于报告或批处理)。对于显示列表,我只加载所需的字段,而不是整个实体(如果只读选定的字段,而不是整个实体,则它们始终为只读)


因此答案是,是的,它将使Hibernate更快一些,但还有其他方法可以获得更高的性能。

使用只读实体更像是一种意愿的表达。通过使用只读,hibernate不会检查实体是否已更改,即使它已更改。这与标记为不可变的实体不同,因为这些实体是防止更改的。如果Hibernate检测到不可变实体对象的属性已更改,但只读实体的属性未更改,则Hibernate将出错

因此,将实体设为只读只会通知hibernate您不希望更改持续存在。在关联集合的情况下,也可能不是这样

除非您有特殊要求或进行特殊昂贵的脏污检查,否则性能增益是最小的

因此,这与性能无关。这是一种安全措施,允许您保护您的数据库不受对象意外更改的影响


例如,您有一个描述地理位置的位置实体。现在您有了一个人,并为其指定了一个位置。使用人员关联加载位置时,您可以将位置设置为只读,即使您的同事(或您自己)意外更改了位置。不会存储更改,但仍会存储对Person实体的更改。(最好将位置标记为不可变,但在少数情况下,这是不够的。)

您所说的是分离实例还是托管实例?它是具有分层体系结构的web应用程序吗?当你说用户时,你是指将使用你的API访问数据的开发人员还是应用程序的普通非技术用户(与视图层交互)?我使用带hibernate的db视图来显示包含必需字段的列表。只读对象是否始终保留在缓存中?那不是被驱逐了吗?