Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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/0/performance/5.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(5.2.5)会话级缓存是否会终止性能?_Java_Performance_Hibernate_Jpa_H2 - Fatal编程技术网

Java 默认的Hibernate(5.2.5)会话级缓存是否会终止性能?

Java 默认的Hibernate(5.2.5)会话级缓存是否会终止性能?,java,performance,hibernate,jpa,h2,Java,Performance,Hibernate,Jpa,H2,我不确定观察到的这种影响是否是由于Hibernate的会话缓存造成的,但在我看来是这样的。我目前正在针对存储在SSD上的H2(v1.4.x/MVCC)数据库后端运行测试单元。我正在插入10k+行,“纯”JPA的性能非常差,我有一个CPU以最大速度运行,以每秒200-300的速度插入“常规”行。现在有趣的部分是:当我将每个insert语句('em.persist(…)')包装到一个单独的事务中,并在提交后立即将持久化对象从实体管理器中“分离”出来时,速度提高了十倍。不知何故,Hibernate似乎

我不确定观察到的这种影响是否是由于Hibernate的会话缓存造成的,但在我看来是这样的。我目前正在针对存储在SSD上的H2(v1.4.x/MVCC)数据库后端运行测试单元。我正在插入10k+行,“纯”JPA的性能非常差,我有一个CPU以最大速度运行,以每秒200-300的速度插入“常规”行。现在有趣的部分是:当我将每个insert语句('em.persist(…)')包装到一个单独的事务中,并在提交后立即将持久化对象从实体管理器中“分离”出来时,速度提高了十倍。不知何故,Hibernate似乎忘记了转储持久化对象,并在没有任何可检测限制的情况下对它们进行累积

为什么默认性能如此糟糕?真的没人在乎吗?或者我到底做错了什么

出于某种原因,Hibernate抱怨JDBC连接最初没有处于自动提交模式。这有关系吗

Hibernate似乎忘记了转储持久化对象

不,它不会忘记任何东西。它故意在会话中对它们进行管理,因为不这样做会违反它自己的约定:您应该能够在托管对象被持久化后修改它,并将这些更改保存在数据库中。如果JPA返回分离的对象,它将非常无用

当您需要插入大量元素时(这不是Hibernate/JPA设计的用例),如果需要的话,这不应该阻止您显式地分离它们

Hibernate似乎忘记了转储持久化对象

不,它不会忘记任何东西。它故意在会话中对它们进行管理,因为不这样做会违反它自己的约定:您应该能够在托管对象被持久化后修改它,并将这些更改保存在数据库中。如果JPA返回分离的对象,它将非常无用


当需要插入大量元素(这不是Hibernate/JPA设计的用例)时,这不应该阻止您在需要时显式地分离它们。

hmm好的,所以这是用例的问题。好吧,这是一个用例问题。泰。