Функция сохранения Play Model на самом деле не записывается в базу данных - PullRequest
3 голосов
/ 06 марта 2012

У меня есть модель воспроизведения с именем "JobStatus", и у нее есть только одно свойство, перечисление с JobState, (Running / notRunning).

Класс расширяет модель и реализуется как одноэлементный.Вы вызываете метод getInstance (), чтобы получить единственную запись в базовой таблице.

У меня есть задание, которое запускается каждый месяц, и в задании я буду переключать состояние объекта JobStatus взад и вперед в разное время.и вызовите .save ().

Я заметил, что на самом деле это не сохранение.

Когда задание запускается, его первая строка кода -

JobStatus thisJobStatus = jobStatus.getInstance();
...// exit if already running

thisJobStatus.JobState = JobState.Running;
thisJobStatus.save()

затем, когда задание будет выполнено, оно изменит статус обратно на NotRunning и снова сохранит.

Проблема в том, что когда я смотрю в базу данных MySql, фактическое значение записи никогда не меняется.

Это приводит к катастрофическому сбою, потому что, когда другие узлы пытаются запустить задание, они проверяют состояние и, поскольку они видят его как NotRunning, все они также пытаются запустить задание.

Так что моя умная схема управления заданиемсостояние сбой, потому что фактическое значение не передается в БД.

Как заставить Play немедленно записывать в БД при вызове .save () для модели?

Спасибо, Джош

Ответы [ 2 ]

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

попробуйте добавить это в JobStatus и вызвать его после сохранения.

public static void commit(){
    JobStatus.em().getTransaction().commit();
    JobStatus.em().getTransaction().begin();
    JobStatus.em().flush();
    JobStatus.em().clear();
}
0 голосов
/ 06 марта 2012

Полагаю, вы хотите пометить свою работу как "работающую" почти как первое, когда работа начинается?В этом случае у вас не должно быть никаких других текущих операторов базы данных ...

Чтобы немедленно зафиксировать изменения в базе данных (вместо того, чтобы после завершения задания), добавьте следующие команды после thisJobStatus.save(); вызов метода:

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

Кроме того, поскольку вы используете MySQL, вы можете заблокировать строку сразу же после извлечения, используя предложение SELECT ... FOR UPDATE.(См. Справочное руководство по MySQL для получения дополнительной информации.) Конечно, вы не захотите использовать это в своем методе getInstance(), иначе каждая операция извлечения заблокирует запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...