通常情况下,RDBMS 数据库将成为您不断增长的应用程序中的主要可伸缩性瓶颈。这是由于 RDBMS 对水平扩展的天然抵制。已经出现了几种策略来缓解这个问题,包括只读副本、分区、分片以及将一些工作负载卸载到 NoSQL 数据库。
在这篇动手实践的文章中,我们将研究另一种可供 Spring/Hibernate 开发人员使用的技术,它可以大大减轻您过度工作的 RDBMS 的负担:即使用 Hibernate 二级缓存。
在 Hibernate(Spring Data/JPA 中的默认持久化提供者)中有两级缓存:
- 1级缓存:是Hibernate Session级别的缓存。所以这是一个内部短期缓存,其用途仅限于单个会话。此缓存无法共享,默认情况下处于启用状态。事实上,它不能被禁用。
- 2 级缓存:是 Hibernate SessionFactory级别的缓存,因此根据定义,它可供所有会话使用。它需要显式配置缓存存储,例如 Ehcache 或 Redis,因此默认情况下禁用。
案例源码
Hibernate L2 缓存支持多个提供程序。两种流行的选择是 Ehcache 和 Redis。
本文的其余部分假定您在本地运行 Redis。如果没有,那么您将需要一些额外的 Redis 以及防火墙配置更改,以便从您的本地开发机器连接到 Redis。
首先,安装Redis....
接下来,我们需要添加和配置Redisson (Redis Java 客户端)。
在您的 pom.xml 文件中,添加依赖项:
<dependency> |
然后将以下基本的 Redisson 配置文件 redisson.yaml 添加到你的 CLASSPATH 资源下。确保 "address "属性符合你的设置。
singleServerConfig: |
在代码中启用二级缓存
将以下注释添加到Planet实体类(在 Planet.java 中):
@Cache(region = "planetCache", usage = CacheConcurrencyStrategy.READ_WRITE) |
这一行通知 Hibernate 这是一个可缓存的实体,并指示它以名称缓存它:planetCache。
要了解有关缓存并发策略的更多信息,请参阅Hibernate 关于此主题的文档。
下一步(也是最后一步)是在 application.properties 中启用缓存:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true |
您可以使用上述属性打开和关闭二级缓存。