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

133 天前
 iintothewind
很多集合操作本来可以很方便的 paralStream 然后调用数据库处理,
或者从 servlet 主线程拿到数据提交异步操作处理。

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

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

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

所以说…还是优化一下代码设计吧,持久层框架不背这个锅
leegradyllljjjj
133 天前
不要问问就是 lock
miaotaizi
133 天前
我能不能理解为 你没用好多线程?
m2276699
133 天前
对象面错了?
vituralfuture
133 天前
我怀疑你说的就是 ACID
Goooooos
133 天前
说个你认知能力内是数据库连接线程安全的 ORM 框架,不限语言,好让我开开眼界、学习学习新知识
liumao
133 天前
可以看看你的代码吗
iintothewind
133 天前
@Bingchunmoli
@chendy
@miaotaizi

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

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

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

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

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

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

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

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

看到你们的讨论来了点兴趣,问了下机器人,不知道是不是符合你们聊的主题
geligaoli
133 天前
为何要 parallelStream 并行操作数据库?
数据库的建立连接是很耗资源的,要不就没有连接池的概念了。 正常的流程,不应该是 单线程读取数据 => 放到集合中 => parallelStream 处理集合 => 单线程写回数据库 ,这样的么?
Vegetable
133 天前
给我干懵了,这就是 JAVA 程序员的含金量吗?
什么框架的 Session 是线程安全的啊?哪有这种东西?想实现你的安全必须给每个线程自动初始化隔离的 Session ,你听听这是人话吗,什么框架敢这么干?
如果你想并行处理,请自己管理互相隔离的数据库连接,而不是期待着 spring 帮你搞定,不要硬黑。
seedscoder
133 天前
`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