Делай Джобс делись EntityManagers - Играй!Фреймворк - PullRequest
3 голосов
/ 24 марта 2012

Допустим, у меня в данный момент запущено три задания, два из которых идентичны ... так:

CrawlJob job1 = new CrawlJob();
CrawlJob job2 = new CrawlJob();
CurrentJob job3 = new CurrentJob();
job1.now()
job2.now()
job3.now()

Если я выполню следующие действия в job1:

JPA.em().flush();
JPA.em().clear();

Будет ли этотакже отсоединить все объекты, которые в данный момент обрабатывают job2 и job3?То есть, если я передаю объект / модель объекта в job2 / job3, который я искал в базе данных, можно ли нарушить job2 / job3, потому что объект будет только что отсоединен от сеанса?

Аналогично, скажем, я делаю следующее в job1:

long id = 123
User user1 = new User(id);
user1.save();

А затем в job2 или job3 я делаю:

User user2 = User.findById(id);

будет user2 равным "нулю" или равным "user1"«?То есть, хотя user1 еще НЕ был сброшен / передан в базу данных, смогут ли job2 или job3 найти его по Id?

Я думаю, что оба эти вопроса связаны с тем, являются ли Джобс (независимо отявляются ли они экземплярами одного и того же задания или другого задания), совместно используют EntityManager и, следовательно, .em (). flush (), .em (). clear () или .em (). getTransaction (). commit () ИЛИ Model.save () повлияет на все задания одновременно?

1 Ответ

3 голосов
/ 25 марта 2012

Задания начинают свою собственную транзакцию jpa, и ваши сущности не будут сохраняться до тех пор, пока транзакция не завершится.

Таким образом, job2 не увидит изменения, внесенные job1, если задание 1 не завершится, когда job2 загрузит объект.

Если вы хотите зафиксировать данные во время работы jobs1, вы можете зафиксировать транзакцию в job1 и начать новую, например:

    JPA.em().getTransaction().commit();
    JPA.em().getTransaction().begin();
    JPA.em().flush();
    JPA.em().clear();
...