EcipseLink JPA 2.0 нужно обновить () / flush ()? - PullRequest
2 голосов
/ 14 декабря 2011

У меня странное поведение противоречивых данных, возвращаемых из моей БД, когда к нашему веб-приложению подключено более 150 пользователей.

Мои EJB-модули подключаются к MySQL через в основном сгенерированный код Netbeans 7.0, настроенный немного для повторного использования.-юзабилити.Случается так, что очень часто пользователь получает (в браузере) данные, которые не должны быть такими.Т.е. пользователь просматривает сведения о продукте A, но часть данных (некоторые данные отношения один-ко-многим) принадлежат другому продукту.У нас нет этой проблемы, когда меньше пользователей вошли в систему.Кажется, проблемы начинают возникать примерно у 150 пользователей.

Часть кода EntityManager делает только em.create(...), em.persist(...) или em.merge(...).Нет refresh() или flush().Я отключил общий кеш.У меня нет балансировки нагрузки.

Что / Где я могу посмотреть больше?

1 Ответ

4 голосов
/ 16 декабря 2011

Это зависит от вашей ситуации.

Но для вашей информации, если вы хотите использовать эти методы:

refresh() обновляет сущность с данными в таблице базы данных.

flush() делает прямо противоположное, сохраняет значения в сущности в таблицу базы данных.

Но поскольку вы используете EJB, если вы используете CMP, то по умолчанию все методы в EJBвыполнить в транзакции (если атрибуты транзакции не предоставлены, чтобы не использовать их).И транзакция начинается с вызова метода и заканчивается, когда метод завершен.В конце он фиксируется, что означает, что вам не нужно звонить на flush().Но если вам нужно синхронизировать базу данных с сущностью перед фиксацией, вам нужно вызвать flush().

Кроме того, это действительно зависит от ваших требований.

...