使用'同'关键词上的方法中的一个Java道会引起问题时使用的一个网络应用程序?

我问是因为我有一个多线程的独立的应用程序需要的方法,以通过同步,以避免资源的冲突,因为在这里看到。

java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection

什么我关心的是,当大量的人尝试和使用的应用程序,同步的方法,将阻止和缓慢的整个应用程序下来。

我使用的弹簧注访问用户实体管理的工厂,其中提供了一个实体的管理DAO。我可以在技术上删除的道层和有类调实体经理工厂可直接的,但是我享受分离的道提供的。

我还应该注意到,我正在非常小心,不要通过连接的实体对象对象之间的螺纹。我推测的资源冲突的错误是当访问道。我想多个线都要在同一时间和努力来保持或从中读取的数据库,在非原子的方式。

在这种情况下使用的是一道要做更多的伤害,然后帮助吗?


一大块的信息我离开了这个问题是,该岛是不是一个单独.如果我已经想清晰地,足以包括详细说明我可能不会有问这个问题放在第一位。

如果我理解正确的话,弹簧创建一个新的实例道类的每一类使用它。这样的背实体的管理应该是唯一的每个螺纹。不共享的实体管理,作为抢劫H回答说,关键的一点在这里。

然而,现在我不明白为什么我的错误,当删除同步。


根据这个 螺纹, ,@PersistenceContext注创建一个线程安全SharedEntityManager.所以你应该能够创建一个单独道。

有帮助吗?

解决方案

您说你是不是在线程之间共享实体对象。那很好。但是,你也应该确保你没有共享的的EntityManager 对象(或会话在Hibernate中的对象)跨线程两种。像Spring框架由一个线程局部变量存储会话自动管理这个给你。如果你正在编写您自己的DAO没有一个框架的帮助下,你需要自己采取预防措施以避免共享。

一旦你做到这一点,应该没有理由因为没有会话状态将在线程间共享同步DAO方法。这是一个高并发Web应用程序的关键。另一种方法就是只有一个线程可以在同一时间访问DAO,假设他们都有着相同的DAO实例。也不好吞吐量。

其他提示

如果它需要同步,用于线的安全,那么把他们留在那里。阻止需要无论如何在这种情况。如果阻止不需要的网络应用程序的情况下,可以:

  • 离开它,因为,由于业绩 击中时没有竞争 锁是可以忽略不计,并且 微不足道的当考虑 该费用的数据库。
  • 重新设计,以便添加一个 同步层 独立应用程序的情况下它 保护下 不同步道。

就个人而言,我将把它作为是和配置它看如果你需要的重构。直到那时你只是做过早的最优化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top