在Java DAO中的方法上使用'synchronized'关键字会导致Web应用程序使用时出现问题吗?在Java DAO上使用同步会导致问题吗?
我问,因为我有一个多线程独立应用程序需要通过同步的方法来避免资源冲突,如此处所示。
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。
您可以扩展您使用同步的原因,以及您指的是什么样的“资源冲突”? – skaffman 2009-07-10 15:45:25