介绍

尽管有SQL标准,但每个关系数据库终将是唯一的,因此你需要调整数据访问层,以便充分利用在使用中的关系数据库。

在本文中,我们将介绍在使用带有JPA和Hibernate的MySQL时,为了提高性能,我们可以做哪些事情。

不要使用AUTO标识符GeneratorType

每个实体都需要标识符,标识符惟一地标识与该实体关联的表记录。JPA和Hibernate允许根据三种不同的策略自动生成实体标识符:

  • IDENTITY
  • SEQUENCE
  • TABLE

正如我在这篇文章中所解释的,当增加数据库连接数时,TABLE标识符策略不会缩放。而且,即使是一个数据库连接,标识符生成响应时间比使用IDENTITY或SEQUENCE大十倍。

如果你使用AUTO GenerationType

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

Hibernate 5将会退回到使用TABLE生成器,这对性能不利。

正如我在这篇文章中所解释的,你可以使用以下映射轻松解决此问题:

@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator="native")
@GenericGenerator(name = "native", strategy = "native")
private Long id;

本地生成器将选择IDENTITY而不是TABLE。

IDENTITY生成器禁用JDBC批处理插入

MySQL 5.7和8.0都不支持SEQUENCE对象,因此你需要使用IDENTITY。但是,正如我在这篇文章中所解释的,IDENTITY生成器可以防止Hibernate使用JDBC批量插入。

JDBC批量更新和删除不受影响,只有INSERT语句不能被批处理,因为在Persistence Context被刷新之前,INSERT语句已被执行,从而Hibernate知道要分配给持久化实体什么实体标识符。

如果要解决此问题,则必须通过不同的框架,如jOOQ,执行JDBC批处理插入。

通过Docker和tmpfs加速集成测试

MySQL和MariaDB在不得不丢弃数据库模式的时候,以及每次新的集成测试即将运行因而重新创建它的时候,是非常慢的。但是,你可以在Docker和tmpfs的帮助下轻松解决此问题。

正如我在这篇文章中所解释的,通过映射内存中的数据文件夹,集成测试的运行速度将与有内存数据库(如H2或HSQLDB)时的速度相同。

对非结构化数据使用JSON

即使是在你使用RDBMS的时候,肯定也有很多次想要存储非结构化数据:

  • 来自客户端,如JSON的数据,需要被解析并插入到我们的系统中。
  • 可以缓存的图像处理结果以保存再处理

虽然本机不支持,但是你可以轻松地将Java对象映射到JSON列。甚至可以将JSON列类型映射到Jackson JsonNode。

更重要的是,你甚至不必编写这些自定义类型,可以从Maven Central中抓取:

<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>1.0.0</version>
</dependency>

很酷,对吧?

使用存储过程来保存数据库

在处理大量数据时,将所有数据移入和移出数据库并不是非常高效。不过,通过调用存储过程对数据库端进行处理会好很多。

小心ResultSet流

SQL流在两层应用程序中是很有意义的。如果你要执行ResultSet流,那么你也得注意JDBC驱动程序。在MySQL上,你需要将Statement大小设置为Integer.MIN_VALUE。

然而,对于基于Web的应用程序,分页更为合适。JPA 2.2甚至引入了对Java 1.8 Stream方法的支持,但执行计划可能不如使用SQL级别分页时那么高效。

PreparedStatements可能会被仿真

你可能以为,既然Hibernate默认使用PreparedStatements,那么所有语句都是像这样执行的:

实际上,更像是这样执行的:

正如我在这篇文章中所解释的,除非你设置了useServerPrepStmts MySQL JDBC驱动程序属性,否则PreparedStatements将在JDBC驱动程序级别进行仿真以保存一个额外的数据库。

始终结束数据库事务

在关系数据库中,每个语句都在给定的数据库事务中执行。因此,事务是不可选的。

但是,你应该始终通过提交或回滚来结束当前正在运行的事务。忘记结束事务可能会导致持续被锁很长时间,同时也会阻止MVCC清理过程回收不再需要的旧元组或索引条目。

递交日期/时间没有那么容易

编程中有两件非常复杂的事情:

  • 处理编码
  • 处理跨多个时区的日期/时间

为了解决第二个问题,最好在UTC时区中保存所有时间戳。但是,当使用MySQL时,你还需要将useLegacyDatetimeCode JDBC Driver配置属性设置为false

结论

正如你所看到的,在使用带有JPA和Hibernate的MySQL时,要记住许多事情。因为MySQL是最为广泛部署的RDBMS之一,并被绝大多数的Web应用程序所使用,所以,了解所有这些技巧并调整数据访问层来最大限度地利用它非常有用。

JPA和Hibernate的相关使用技巧的更多相关文章

  1. 三年总结出来的11个JPA和Hibernate查询配置小技巧

    JPA和Hibernate提供了一系列暗示hints能够帮助你更好地定制你的查询语言,这些小暗示或暗语是一种附加信息,你可以利用这些暗语做很多事情,比如设置查询的timeout,使用实体图或定义查询缓 ...

  2. JPA入门例子(采用JPA的hibernate实现版本) 转

    JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...

  3. JPA(Hibernate)

    JPA 1,JPA:Java Persistence API.JPA通过JDK 5.0注解-关系表的映射关系,并将运行期的实体对象持久化到数据库中.JPA是JavaEE中的标准.JPA标准只提供了一套 ...

  4. JPA和Hibernate到底是什么关系???

    转自:https://www.cnblogs.com/mosoner/p/9494250.html 在学习框架的过程中,发现学的东西很多,但是感觉他们之间的联系区别都不是很了解,知道JPA可以去实现持 ...

  5. 简述 JPA 与 Spring Data JPA 与 Hibernate

    1.JPA是什么?以及相关概述 JPA的是 Java Persistence API 的简写,是Sun官方提出的一种ORM规范! Sun提出此规范有2个原因: 1.简化现有Java EE和Java S ...

  6. JPA 入门程序及相关注解

    1. 概述 JPA(Java Persistence API):用于对象持久化的API; JPA本质上是一种ORM规范,不是ORM框架;提供了一些编程的API接口; Hibernate是实现; 1.1 ...

  7. javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful

    一.介绍 1.springboot是spring项目的总结+整合 当我们搭smm,ssh,ssjdbc等组合框架时,各种配置不胜其烦,不仅是配置问题,在添加各种依赖时也是让人头疼,关键有些jar包之间 ...

  8. JPA入门例子(采用JPA的hibernate实现版本) --- 会伴随 配置文件:persistence.xml

    JPA入门例子(采用JPA的hibernate实现版本) 分类: j2se2011-03-30 16:09 45838人阅读 评论(9) 收藏 举报 jpahibernate数据库jdbcjava框架 ...

  9. JPA和hibernate的关系

    实际上,JPA的标准的定制是hibernate作者参与定制的,所以JPA是hibernate的一个总成,可以这么理解

随机推荐

  1. 前端性能优化:gzip压缩文件传输数据

    一.文件压缩的好处 前端生产环境中将js.css.图片等文件进行压缩的好处显而易见,通过减少数据传输量减小传输时间,节省服务器网络带宽,提高前端性能. 二.http协议如何支持压缩文件的传输 1.浏览 ...

  2. Mac Terminal终端光标的快捷键操作

    2016年08月18日 18:26:06 阅读数:4217 Mac Terminal终端和linux上终端光标的快捷键操作是一样的,都是来自Emacs这个神级的编辑器,由于我以前vim用的多,没怎么用 ...

  3. 启动tomcat服务器,配置CATALINA_HOME和JAVA_HOME

    遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...

  4. windows兼容方式安装python[转]

    Python 是一门很不错的语言,语言简单易学,又不失脚本语言的灵活性,还有海量的第三方库,覆盖的很全面.但也有不少“硬伤”,比如 Python 2.x 和 Python 3.x 版本之间的不兼容等等 ...

  5. Java语言主要特点有哪些?

    1.简单 Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了.Java语言的简单性主要体现在以下三个方面: 1) Java的风格类似于C++,因而C++程序员是非常熟悉的.从某 ...

  6. vue组件重新加载(刷新)

    vue组件重新加载(刷新) 第一种方法:利用v-if控制router-view,在根组件APP.vue中实现一个刷新方法 <template> <router-view v-if=& ...

  7. C# WinForm启动时的事件加载次序

  8. 『PLSQL』在oracle表中怎样创建自增长字段?

    1.建立测试数据表CREATE TABLE TEST( ID NUMBER, NAME VARCHAR2(20), PRIMARY KEY(ID)); 2.创建序列CREATE SEQUENCE SE ...

  9. tnsping命令解析

    tnsping命令格式: tnsping <service_name> n n的意义是可以让tnsping ping多次 例: c:\Documents and Settings\Tony ...

  10. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...