Spring data JPA 开启二级缓存,分布式部署一般用什么方案?

2024-01-05 16:50:58 +08:00
 seraphv3

本小白程序员是写 java 的,但是工作了多年,用到真正的面向对象技术的机会比较少,所以去年自己做了一个面向对象的简单 demo 项目。

https://zhuanlan.zhihu.com/p/605481077

用的 Spring data JPA ,比较能够符合面向对象的风格。所谓 JPA ,java persistence architecture ,这个 persistence 就很有面向对象的味道,对象活在内存中,但是也需要在合适的时候持久化到数据库。

不过 Spring data JPA 的二级缓存才是活在内存中的对象,如果要分布式集群部署服务,一般怎么实现二级缓存的对象共享呢?

5433 次点击
所在节点    Java
45 条回复
maojun
2024-01-05 19:20:03 +08:00
@seraphv3 qq 号起码删了吧
seraphv3
2024-01-05 20:05:56 +08:00
@maojun 完了,没想到,现在删不了了。。。
seraphv3
2024-01-05 20:10:27 +08:00
@daybreakfangyang 是的,我是这样希望的,对象创建出来之后,除非被删掉,期望它一直活着
NickX
2024-01-05 20:53:10 +08:00
“我理解的面向对象,对象都是活在内存里的,只是在必要时候才持久化到数据库”

看到你对面向对象的理解,我瞬间不知道怎么跟你解释。
joyhub2140
2024-01-05 22:08:42 +08:00
缓存一致性又如何解决?
cnhongwei
2024-01-05 22:32:02 +08:00
个人建议不要使用二级缓存,而是使用 Spring cache ,当然过期处理复杂一些。
likooo125802023
2024-01-05 22:35:47 +08:00
~~~ 真幸福。。。

当年啥缓存都是我们自己写的。
NeroKamin
2024-01-05 23:54:02 +08:00
1.建议重新理解一下面向对象的概念
2.缓存一致性是更大的问题
Mmahaha
2024-01-06 00:46:53 +08:00
面向对象是对标面向过程的,不是你说的这个意思
keepRun
2024-01-06 06:46:17 +08:00
二级缓存处理起来坑爹,要优化性能显然是找到瓶颈去优化,将高频性能损耗点手动加上 redis 缓存即可大大优化性能,而且往往这种优化点不会特别多,封装好了方法后使用起来非常方便、易于理解、支持分布式。
nnegier
2024-01-06 09:04:36 +08:00
@NeroKamin 可以讲讲一致性吗?我也很头疼一致性
siweipancc
2024-01-06 10:21:14 +08:00
别用,缓存只用来计算结果跟文件处理。
你顶多用上 hibernate 的 es 跟 env 两个特性。
bthulu
2024-01-06 11:44:52 +08:00
orm 要什么缓存, 缓存在你接口处实现
yogogo
2024-01-06 14:33:55 +08:00
@seraphv3 #23 回收机制了解下,单例模式了解下,OOM 了解下,查询缓存了解下,你再回来看看你在说啥内容
skwyl
2024-01-06 14:38:42 +08:00
@seraphv3 面向对象是面向对象,缓存是缓存,二级缓存其实很烦,不建议使用,我现在就是 hibernate 内存飙升,实际上大多数情况都用不到这个缓存,需要缓存的地方说明得引入 redis 等缓存中间件。
skwyl
2024-01-06 14:42:23 +08:00
@seraphv3 关于你这个级联查询问题,@OneToMany 确实是直接查数据库的,但是我非常不建议你在实体里面做级联,累一点引入一下 Service 维护起来会好很多,在实体里面做级联非常考验你们表结构设计的合理性,而且不易于维护。
seraphv3
2024-01-06 17:16:45 +08:00
@skwyl 我测试了下,@OneToMany 级联的对象也有二级缓存,不知道 QQ 群的老哥是怎么测试的。实体类里面做级联我认为是实现模型层的一个主要方法,不然你就没有对象模型了
seraphv3
2024-01-06 17:22:27 +08:00
@skwyl 当然也可以手动查库之后加载构建对象模型,这就可以不用 jpa 了。或者你不要对象模型,那就跟直接查库,查库之后手动放 redis ,其实相当于一个不完整的对象模型放在 redis 内存里面,手动维护对象间的关联关系
stone981023655
2024-01-06 19:56:24 +08:00
性能不够了再说吧, 不是开始该考虑的问题
dongzhuo777
2024-01-06 21:08:21 +08:00
@seraphv3
Spring data JPA 的二级缓存,就是个坑。少看点培训班的视频那玩意没用,写 demo 知道原理的实现就行了。
做 ToB 项目,用 Spring data JPA 。只是约束下面的人用 HQL ,纯粹是为了解决同时支持国产/mysql/sqlserver/oracle 。
findbyId 这种方法在我这边一律禁止用。
数据库就是用来持久化的保证最后的一致性的。等有了性能问题 二级三级缓存自己用别的中间件去写啊。
生产项目上用这些别人的二级缓存后面怎么死的不知道的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1006228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX