使用同步上Java道会造成问题?
-
12-09-2019 - |
题
使用'同'关键词上的方法中的一个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实例。也不好吞吐量。
其他提示
如果它需要同步,用于线的安全,那么把他们留在那里。阻止需要无论如何在这种情况。如果阻止不需要的网络应用程序的情况下,可以:
- 离开它,因为,由于业绩 击中时没有竞争 锁是可以忽略不计,并且 微不足道的当考虑 该费用的数据库。
- 重新设计,以便添加一个 同步层 独立应用程序的情况下它 保护下 不同步道。
就个人而言,我将把它作为是和配置它看如果你需要的重构。直到那时你只是做过早的最优化。