我不确定这种观察到的效果是否是由于Hibernate的会话缓存造成的,但它看起来就是这样。我目前正在针对存储在SSD上的H2(v1.4.x / MVCC)数据库后端运行测试单元。我插入10k +行并使用' pure' JPA非常差,我有一个CPU以最大速度运行,插入常规'行速度为每秒200-300。现在有趣的部分是:当我将每个插入语句(' em.persist(...)')包装到一个单独的事务中时,'分离'提交后立即从实体管理器中持久化的对象,速度提高了十倍。不知何故,Hibernate似乎忘记了转储持久化对象并在没有任何可检测限制的情况下累积它们。
为什么默认性能如此糟糕?真的没有人关心这个或我在这里弄错了什么?
出于某种原因,Hibernate抱怨JDBC连接最初没有处于自动提交模式。这有关系吗?
答案 0 :(得分:4)
Hibernate似乎忘记了转储持久化对象
不,它不会忘记任何事情。它会故意在会话中管理它们,因为不这样做会违反自己的合同:您应该能够在持久化后修改托管对象,并将这些更改保存在数据库中。如果返回分离的对象,JPA将毫无用处。
如果您需要as the documentation suggests doing,当您需要插入大量元素时(这不是Hibernate / JPA的用例) )。