Будет ли использование ключевого слова «synchronized» в методах Java DAO вызывать проблемы при использовании веб-приложением?
Я спрашиваю, потому что у меня есть многопоточное автономное приложение, которому необходимо синхронизировать методы, чтобы избежать конфликта ресурсов, как показано здесь.
java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection
Что меня беспокоит, так это то, что, когда значительное количество людей пытается использовать приложение, синхронизированные методы блокируют и замедляют работу всего приложения.
Я использую фабрику диспетчера сущностей в JPA, которая предоставляет диспетчер сущностей для DAO. Я мог бы технически удалить слой DAO и заставить классы напрямую вызывать фабрику диспетчера сущностей, но мне нравится разделение, которое обеспечивает DAO.
Я должен также отметить, что я очень осторожен, чтобы не передавать объекты ORM связанных сущностей между потоками. Я предполагаю, что ошибка доступа к ресурсам возникает при доступе к DAO. Я думаю, что несколько потоков идут одновременно и пытаются сохранить или прочитать из базы данных неатомарными способами.
В этом случае использование DAO принесет больше вреда, чем помощи?
Большая часть информации, которую я не упомянул, состоит в том, что DAO не является единичным. Если бы я думал достаточно ясно, чтобы включить эту деталь, я бы, вероятно, не задавал вопрос в первую очередь.
Если я правильно понимаю, Spring создает новый экземпляр класса DAO для каждого класса, который его использует. Таким образом, управляющий объект должен быть уникальным для каждого потока. Ключевым моментом здесь, как ответил Роб Х, является отсутствие общего доступа к менеджеру сущностей.
Однако теперь я не понимаю, почему я получаю ошибки при удалении синхронизированных.
В соответствии с этим потоком аннотация @PersistenceContext создает поточно-ориентированный SharedEntityManager. Таким образом, вы должны иметь возможность создавать синглтон DAO.