Java实战特训营-2.2基于SpringData实现数据访问

Spring Data

Repository架构模式


Spring Data JPA更多关注Repository架构模式的实现,关注业务模型和数据对象间的映射
领域对象,不是纯粹的数据库数据存储对象(技术数据),面向业务的对象。

SpringData


Spring Data JPA

JPA有一套接口规范,类似JDBC

JPA规范

查询

  • @Query
  • 方法名衍生查询
  • QueryByExample
  • Specification机制

应用

依赖和配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/customer_hangzhou?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
username: root
password: root
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect

N + 1问题

JoinFetch解决

特定场景可用,如下第二个方法,要先查出所有在做条件判断In

优缺点分析

数据访问优化策略

  • 优化Fetch Size 和连接池配置
  • 使用批处理和选择合适的提交模式
  • 通过统计找到数据访问瓶颈
  • 使用延迟加载数据库访问
  • 使用多级缓存提升数据访问性能

Fetch Size

指定一次从数据库检索的行数,合理设置大小,可减低网络通信次数带来性能提升。
不可硬编码,确保其可配置,根据不同环境,JVM堆内存大小配置。
配置过大,可能导致内存不足(大量请求同时获取数据时)

连接池

  • 连接池大小
    一般偏大设置,但过大会导致性能下降,根据实际用户并发量进行性能测试结果设置。
  • 检查连接泄露 默认配置
  • 验证链接 默认配置

多系统访问同一个数据库时,根据应用本身的属性考虑如何分配连接

使用批处理和选择合适的提交模式

数据库驱动程序在每个sql操作后向数据库发送一个提交请求,引起一个网络调用。

每次提交需将事务更改写入数据库,涉及耗时的磁盘IO。
可以把自动提交关闭,但有些应用为确保数据完整性不可关闭。

使用统计和延迟加载机制

延迟加载关联数据
统计数据,分析原始数据,找到系统瓶颈

多级缓存提升数据访问性能

mybatis

其他

spring data jpa & h2

其他解决方式

  • EntityGraph