当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate/JPA与JDBC按主键查找

蔚弘量
2023-03-14

我正在两个应用程序之间进行基准测试,一个是用jpa2/hibernate4构建的,另一个是用JDBC构建的。总体而言,差异不太大(小于一个数量级)。唯一的例外是当我通过主键获取记录时
使用JDBC的时间不超过10毫秒,使用Hibernate的时间从不低于60毫秒。我已经安装了ehcache,但是对于这个特定的查询,差异仍然是一样的<有没有什么我不知道的技巧?

---编辑

JPA映射和类是使用Hibernate工具构建的,它们没有什么特别之处。JDBC从Oracle恢复PL/SQL对象(正如我在其他基准测试中测试的那样,它比恢复原始数据要慢)。

当测试的复杂性增加时,两种技术之间的比较会变得更加均衡,最终Hibernate/JPA对于某些测试(比如恢复许多复杂对象)会更好。

关键是,我不能用Hibernate/JPA进行任何时间少于60毫秒的操作。似乎Hibernate/JPA有一个最短的时间来完成最便宜的事务(在这种情况下,通过PK恢复记录)。有没有办法减少这一时间?

共有1个答案

凌伟泽
2023-03-14

您可以分析执行情况,以查看Hibernate在这段时间内做了什么,而不仅仅是检查运行时间。你会检查安德烈我说的话。由于对象实例化和反射操作,大部分开销可能会发生。因为id搜索将返回更少的数据,所以Hibernate开销可能更明显。

 类似资料:
  • 使用JPA2。0(通过Hibernate 4),我可以使用EntityManager在数据库中查询查询条件为主键的记录。查找(java.lang.Class entityClass,java.lang.Object primaryKey)。但是,如果查询条件不是主键(例如,选择city值为“london”的所有记录),我是否必须创建一个TypedQuery并显式提供SQL语句?我应该采取什么最佳做

  • 我有以下问题,我有一个已经存在的表,有三个字段field1,field2,field3。Field1实际上是另一个表的外键(@OneToOne)。所有字段2和字段3都可以为空,所以我不能为所有三个字段设置主键。在数据库中,field1 field2 field3有一个唯一约束。 我用JPA/Hibernate尝试了几种解决方案,但没有找到一个好的。如果不定义@Id,JPA当然无法工作。在@Embe

  • 问题内容: 在哪些典型的现实生活场景中,人们会选择Spring Data JDBC / Spring Data JPA与Hibernate?我想了解最适合这两种实现方式的场景。 问题答案: 正如@Naros所说,标题中当前存在的问题实际上并没有解决。似乎我们应该真正看一下4个选项,并且主要列出每种方法的优点,缺点是没有其他方法的优点: 没有Spring数据的JDBC 您可以对所发生的事情进行100

  • 我遇到了一个非常有趣的场景。我知道n+1问题和FetchType.Eager和FetchMode.join。我有一个家长实体学校,它有2@onetomany儿童实体ie学生和教师。我需要所有3个,所以使用fetchtype.eager和fetchmode.join。 学校实体 学生实体 教师实体 学校回购 如果我通过findById方法获取School对象,即表的主键。 生成的SQL是学校、学生和

  • 我有一个复合主键,其中一个键为空。实体中必须存在哪些注释,以便我可以使用此类JPA获取数据: 我尝试使用IdClass Annotation和EmbeddedId Annotation,但出现异常: 例如,使用了数据,但在实际项目中使用了类似的数据,因此无法用值替换null。

  • 问题内容: 我需要能够在内存中的HSQL数据库中每5秒以至少8000个对象的一致速率插入/更新对象。 我已经在Spring / Hibernate / JPA和纯JDBC之间进行了一些比较性能测试。我发现使用HSQL的性能存在显着差异。通过Spring / Hib / JPA,我可以在5秒钟内插入3000-4000个1.5 KB对象(具有一对多和多对多关系),而直接JDBC调用我可以插入10,00