【发布时间】:2009-07-10 15:42:04
【问题描述】:
在 Java DAO 中的方法上使用“同步”关键字是否会在 Web 应用程序使用时引起问题?
我问是因为我有一个多线程独立应用程序,需要同步方法以避免资源冲突,如此处所示。
java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection
我担心的是,当大量人尝试使用该应用程序时,同步方法会阻塞并减慢整个应用程序。
我正在使用 Spring 注入的 JPA 实体管理器工厂,它为 DAO 提供了一个实体管理器。从技术上讲,我可以删除 DAO 层并让类直接调用实体管理器工厂,但我喜欢 DAO 提供的分离。
我还应该注意,我非常小心不要在线程之间传递连接的实体 ORM 对象。我推测是访问DAO时出现资源冲突错误。我认为多个线程同时运行并尝试以非原子方式持久化或从数据库中读取。
在这种情况下,使用 DAO 会造成更大的伤害而不是帮助吗?
我忽略的一个重要信息是 DAO 不是单例的。如果我的思路足够清晰,可以包含这些细节,我可能一开始就不会问这个问题。
如果我理解正确,Spring 会为每个使用它的类创建一个 DAO 类的新实例。因此,支持实体管理器对于每个线程应该是唯一的。正如 Rob H 回答的那样,不共享实体管理器是这里的关键。
但是,现在我不明白为什么我在删除同步时会出错。
根据这个thread,@PersistenceContext 注解创建了一个线程安全的SharedEntityManager。所以你应该能够创建一个单例 DAO。
【问题讨论】:
-
您能否详细说明使用同步的原因,以及您指的是哪种“资源冲突”?
标签: java multithreading web-applications dao synchronized