hibernate 和 mybatis 的 session 都不是线程安全的,为什么还要用?

2024-08-16 07:39:26 +08:00
 iintothewind
很多集合操作本来可以很方便的 paralStream 然后调用数据库处理,
或者从 servlet 主线程拿到数据提交异步操作处理。

但由于 hibernate 和 mybatis 的 session 都不是线程安全的,
导致在多线程环境下,
通过 hibernate 和 mybatis 的数据库改动可能会出现问题,

如果从多线程操作数据库的角度考虑,
我是真的不喜欢这俩老掉牙的难用的框架,
真的不喜欢。

大家有什么看法?
6307 次点击
所在节点    Java
61 条回复
blankmiss
2024-08-16 08:20:15 +08:00
你确定不是事务问题?
iintothewind
2024-08-16 08:22:19 +08:00
@blankmiss 不是,
因为不管是用不用事务,
只要在子线程改变了数据库,
session 都无法同步啊。
Bingchunmoli
2024-08-16 08:28:19 +08:00
线程安全难道不是=事务串行化?
chendy
2024-08-16 08:30:25 +08:00
不是,哥们,啥需求啥场景啊,为了用个 parallel 连持久层框架都看不上了?
而且你这问题不是持久层框架的问题,四舍五入是数据库的问题
因为 session 简单理解其实就是一个连接,既然只有一个连接,连接这玩意本身也不是线程安全的
想象一下,俩线程拿着同一个连接给数据库怼 SQL ,想想都头大。就算有好心的厂家给加了个 syncronized ,一个线程操作还没完,另一个线程直接一个 commit ,想想头更大了

所以说…还是优化一下代码设计吧,持久层框架不背这个锅
leegradyllljjjj
2024-08-16 08:37:20 +08:00
不要问问就是 lock
miaotaizi
2024-08-16 08:41:10 +08:00
我能不能理解为 你没用好多线程?
m2276699
2024-08-16 08:49:04 +08:00
对象面错了?
vituralfuture
2024-08-16 08:53:50 +08:00
我怀疑你说的就是 ACID
Goooooos
2024-08-16 08:55:38 +08:00
说个你认知能力内是数据库连接线程安全的 ORM 框架,不限语言,好让我开开眼界、学习学习新知识
liumao
2024-08-16 08:57:38 +08:00
可以看看你的代码吗
iintothewind
2024-08-16 08:58:17 +08:00
@Bingchunmoli
@chendy
@miaotaizi

我不明白, 明明 session 不支持多线程导致 parallelStream 之后的操作都不支持,
这是因为 Hibernate ,MyBatis 这么老的框架在架构之初,parallelStream 根本就不存在导致的,因为 Hibernate ,MyBatis 太老了,该换掉了,我说的是这个设计的缺陷, 怎么就老扯别的????

我当然知道因为 session 不支持多线程想办法绕过啊,
不在多线程环境用, 加锁。。。。。等等,

我说的是框架上设计的不足
如果这俩框架本身就支持多线程下操作数据库,不是更好吗?
iintothewind
2024-08-16 08:59:55 +08:00
@Goooooos try google "jdbi threadsafe", you are welcome, dude.
Goooooos
2024-08-16 09:06:55 +08:00
@iintothewind #12 呃,你理解的是这样
cheng6563
2024-08-16 09:15:26 +08:00
非现场安全的库多了去了,你就都别用呗。
iyiluo
2024-08-16 09:18:16 +08:00
这两个框架不用,还能用啥,手搓 jdbc 吗
chendy
2024-08-16 09:18:42 +08:00
@iintothewind
> Hibernate ,MyBatis 这么老的框架在架构之初,parallelStream 根本就不存在导致的

parallelStream 确实不存在,但是多线程机制早就存在了,以前怎么处理多线程,parallelStream 里怎么处理就行了

> 如果这俩框架本身就支持多线程下操作数据库,不是更好吗?

问题在于,什么叫支持多线程操作数据库?如果想保证基本的操作,加个锁就行不用框架动;如果操作复杂,要处理比如谁前谁后,谁和谁抢锁,谁和谁联动,这么多细节问题也不是框架能决定的,是写代码的人决定的

> 因为 Hibernate ,MyBatis 太老了,该换掉了

换成啥也处理不了你这个需求,多线程下的复杂逻辑本来就应该是自己写的
hi9527
2024-08-16 09:19:01 +08:00
@Goooooos #9 django 框架数据库连接线程安全吗
https://chatgpt.com/share/465f22a8-481c-4aeb-a97a-0972b8c8f48f

看到你们的讨论来了点兴趣,问了下机器人,不知道是不是符合你们聊的主题
geligaoli
2024-08-16 09:23:34 +08:00
为何要 parallelStream 并行操作数据库?
数据库的建立连接是很耗资源的,要不就没有连接池的概念了。 正常的流程,不应该是 单线程读取数据 => 放到集合中 => parallelStream 处理集合 => 单线程写回数据库 ,这样的么?
Vegetable
2024-08-16 09:25:22 +08:00
给我干懵了,这就是 JAVA 程序员的含金量吗?
什么框架的 Session 是线程安全的啊?哪有这种东西?想实现你的安全必须给每个线程自动初始化隔离的 Session ,你听听这是人话吗,什么框架敢这么干?
如果你想并行处理,请自己管理互相隔离的数据库连接,而不是期待着 spring 帮你搞定,不要硬黑。
seedscoder
2024-08-16 09:27:12 +08:00
`Spring` 和 `Mybatis` 整合之后,底层使用 `SqlSessionTemplate` 似乎是能做到线程安全?

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

https://www.v2ex.com/t/1065374

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

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

© 2021 V2EX