Как управлять транзакциями базы данных с помощью Entity Manager в относительно большом приложении? - PullRequest
3 голосов
/ 07 сентября 2011

Я разработал довольно большое приложение CRUD, используя базу данных MYSQL и среду Swing Application и javax.persistence.Мой вопрос заключается в том, как мне лучше всего управлять своими транзакциями, учитывая javax.persistence.Entitymanager?В настоящее время у меня есть один экземпляр Entity Manager, удерживаемый классом Application.Он передается всем запрашивающим страницам, которые, в свою очередь, используют его для сохранения и объединения объектов.Я запускаю транзакцию при запуске приложения и фиксирую (и перезапускаю) каждый раз, когда вносятся изменения.Это правильно?или я должен иметь отдельный Entity Manager для каждого компонента / страницы?Когда я должен совершить?Все эти вопросы возникли сейчас, потому что я недавно начал получать исключения типа: java.sql.SQLException: Превышено время ожидания блокировки;попробуйте перезапустить транзакцию. Код ошибки: 1205, из-за чего я понял, что что-то не так в моем управлении транзакциями базы данных ....

Заранее благодарен за любую помощь, которую вы можете мне оказать!

1 Ответ

4 голосов
/ 07 сентября 2011

Запуск транзакции при запуске приложения - не лучшая идея. Транзакции должны быть максимально короткими, поскольку каждая из них блокирует базу данных. Я имею в виду, что каждый раз, когда запускается транзакция, никакой другой поток не может писать в базу данных. То, как вы делаете вещи, с точностью до наоборот: ваша база данных не блокируется только в течение небольших периодов времени. Это вероятная причина ошибки, которую вы получаете.

Обычно рекомендуемый способ управления транзакцией следующий:

EntityManager em = EMF.getEM();
    em.getTransaction().begin();
    // your persist, merge code goes here
    em.getTransaction().commit();
    em.close();

Класс ЭДС это:

public class EMF {
    private static EntityManagerFactory emf;
    static {
        emf = Persistence.createEntityManagerFactory("MyEMF");
    }
    public static EntityManager getEM(){
        return emf.createEntityManager();
    }
}

Таким образом, ваша транзакция блокирует базу данных только во время выполнения кода сохраняемости. Обратите внимание, что при использовании класса EMF фабрика менеджера сущностей создается только один раз. Это хорошо, потому что создание его вычислительно дорого. Однако, как только он создан, создание экземпляра менеджера сущностей становится очень дешевым. Этот краткий учебник объясняет это довольно хорошо.

...