当前位置: 首页 > 面试题库 >

从多个线程修改休眠实体

齐琦
2023-03-14
问题内容

我在了解线程安全的详细信息时遇到了问题Hibernate。我知道这Hibernate Sessions本身并不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到有关Hibernate实体的线程安全性的任何信息。我可以在多线程中修改它们,而又仍然将它们附加到用于加载它们的会话中吗?

我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步,并且hibernate将通过同步的getter访问它们。

我设想的方案:

  • 使用hibernate会话从数据库加载实体A,
  • 随后,从加载实体的线程之外的多个线程修改实体A,
  • 实体A一直保持连接到会话并处于持久状态,
  • 刷新会话,以便将修改与数据库同步。
  • 实体A保持连接到会话,因此可以重复进行该循环,并进行进一步的修改和刷新。

问题答案:

这取决于修改的性质。如果您通过在另一个线程中创建,持久化另一个实体并将其与之关联来修改一个实体,则它将无法工作,因为另一个实体实例将被视为在第一个线程中是分离的。

除了上面的用例之外,从理论上讲,这仅在您不使用字节码检测工具进行脏检查的情况下才有效。Hibernate只会在需要刷新对象时检查它们是否脏;基本上,它并不关心您如何修改对象。

但是,不建议这样做。

首先,它可能与Hibernate / JPA的未来版本不兼容(可能存在更多限制,阻止并发访问实体)。

其次,解决方法非常简单:只需为要同时修改的数据创建DTO,将其提交进行处理,并在处理完成后更新实体。这样,代码更加清晰,不会出现与Hibernate线程相关的意外投诉,您可以灵活地使用其他有用的功能,例如延迟加载。



 类似资料:
  • 我在理解中线程安全的细节时遇到了问题。我知道Hibernate会话本身不是线程安全的,所以我不会从多个线程访问它们。但是,我找不到任何有关Hibernate实体的线程安全的信息。我可以在多个线程中修改它们,而它们仍然连接到用于加载它们的会话吗? 我不会使用延迟加载(我知道这会导致并发问题)。实体将被正确同步,Hibernate将通过同步的getters访问它们。 我设想的情景是: 使用Hibern

  • 主要内容:1 什么是Java 线程休眠,2 Java sleep()方法语法,3 Java sleep()方法例子1 什么是Java 线程休眠 Thread类的sleep()方法 用于使线程休眠指定的时间。 2 Java sleep()方法语法 Thread类提供了两种使线程休眠的方法: public static void sleep(long miliseconds)throws InterruptedException public static void sleep(long milis

  • 问题内容: 我有的: 我有Hibernate实体,它包含许多非瞬态字段,包​​括集合。用户可以分别更新每个字段或一次更新某些字段。 多么大的挑战: 在处理程序中,我应该检查实体的哪个字段已更改: 出于安全性和通知原因,我想这样做。手段: 并非所有用户都可以修改所有字段 我应该在某些字段更改时以特定方式通知特定用户。 有什么问题: 我得到非常丑陋的代码。实际上,我遍历所有字段/集合和调用方法。 题:

  • 本文向大家介绍Java中线程休眠编程实例,包括了Java中线程休眠编程实例的使用技巧和注意事项,需要的朋友参考一下 JAVA中的休眠是sleep()方法,本例子中定义了getC()方法,该方法用于随机产生Color类型的对象,并且在产生线程的匿名内部类中使用getGraphics()方法获取Graphics对象,使用该对象调用setColor()方法为图形设置颜色;调用drawline()方法绘制

  • 问题内容: 我在hibernate和延迟加载方面遇到问题。 背景:我有一个Spring MVC Web应用程序,我将Hibernate用于持久层。我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体。我正在扩展HibernateDaoSupport类,并使用HibernateTemplate保存/加载对象。一切都进行得很好。直至现在。 问题:我有一个可以通过Web

  • 问题内容: 我有一个类,其中每30秒从一个后台线程填充一个映射,然后有一个方法,该方法将由多个读取器线程调用以获取可用的实时套接字,该套接字使用相同的映射来获取此信息。 如您在以上课程中所见: 从每30秒运行一次的单个后台线程,我使用所有活动套接字填充map。 然后,从多个线程中,我调用方法给我一个可用的实时套接字,该套接字使用map获取所需的信息。 我上面的代码线程安全吗,所有阅读器线程都可以正