gpt4 book ai didi

java - hibernate - 进程范围的身份

转载 作者:行者123 更新时间:2023-12-01 23:39:32 25 4
gpt4 key购买 nike

在使用 hibernate 之前,我可以在进程范围的身份环境中工作。这意味着当我从数据库中获取同一对象两次时,它们总是 == 。

在迁移到 hibernate 之前,我曾经通过保留唯一实例的 HashMap 来实现此目的。每次获取结果集时,我都会检查此映射内的先前实例,以便返回相同的对象实例。为了避免内存泄漏并帮助垃圾收集器,我首先将这些唯一实例包装在 WeakReference 对象中,然后再将它们放入映射中。

我(从这个已有 10 年历史的框架)迁移到了 hibernate,以确保我掌握最新的 java 技术。 而且我错误地认为 hibernate 现在会支持这种开箱即用的功能。当然,我很想再次实现自己的缓存。但我的目标实际上是用最少的自写代码来设置我的项目的核心。

实际上大多数网站都试图说服我根本不要使用进程范围身份,因为它被认为是一件危险的事情(死锁,...)。老实说,我有点怀疑,我很确定我可以应付。

我目前正在考虑放弃进程范围的身份,但看起来会产生很多后果。例如:过去我有时将信息(在运行时计算)存储在 transient 字段中。当然现在这已经不可能了。

一些网站写道,使用 EHCache 框架可以达到进程范围的身份。我尝试过但还没有成功。默认情况下它显然是关闭的,我没有找到任何关于如何激活它的示例。

非常欢迎一些建议。

编辑:(更具体)

  • 使用 Hibernate 时是否可以实现进程范围身份
  • 如果是这样,这是好的做法吗?如何实现?

最佳答案

实际上,您实现的内容是 Hibernate 支持的,在给定的 Hibernate session 中

在多个 session (以及事务)之间共享一个唯一的实例没有任何意义,因为这会破坏事务提供的 ACID 功能,并使其完全无用,除非只有一个用户访问数据库。例如,存储在内存中的 transient 字段将完全不正确,因为数据在数据库中被修改而没有经过这个唯一的内存实例。如果某些约束被破坏并导致事务回滚,则您的唯一实例中会留下不正确的值,这些值与数据库中存储的数据的实际情况完全脱节。

关于java - hibernate - 进程范围的身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com