У меня есть приложение Java EE с JPA, реализованное с использованием Eclipselink. Я внедрил базовую систему входа пользователя, используя карту сеанса ExternalContext. Однако кажется, что часто сеанс становится несовместимым с базой данных.JPA Entity не синхронизируется с базой данных с использованием нескольких сеансов
Основной процесс 1. Пользователь A Создает объект BidOrder. 2. Пользователь B создает объект AskOrder. 3. Монитор проверяет два порядка совпадают, и если да создает объект 4. портфель заказов Изменения применяются ко всем пользователям (с помощью Primefaces 5.3 Push)
Когда я просматриваю цены, которые я использую этот метод в моей SessionScoped поддержке боб для моего главного вида:
public void findLatestPrices()
{
logger.log(Level.INFO, "findLatestPrices with user {0} ",user.getUserId());
findAllOrderBooks();
latestPricesId = new ArrayList<String>();
setLatestPricesResults(request.findLatestPrices());
for (Iterator<OrderBook> it = orderBookResults.iterator(); it.hasNext();)
{
OrderBook orderBook = it.next();
logger.log(Level.INFO, "Found {0} orderbook price", orderBook.getPrice());
}
logger.log(Level.INFO, "End of findLatestPrices with user {0} ",user.getUserId());
}
Это вызывает мое RequestScoped Stateful EJB:
public List<OrderBook> findLatestPrices() {
List<OrderBook> orderBooks;
List<OrderBook> orderBooksFiltered;
Map<Member, OrderBook> map = new LinkedHashMap<Member, OrderBook>();
try {
orderBooks = em.createNamedQuery(
"findAllOrderBooks").setHint("javax.persistence.cache.storeMode", "REFRESH")
.getResultList();
for (Iterator<OrderBook> it = orderBooks.iterator(); it.hasNext();) {
OrderBook orderBook = it.next();
Member member = orderBook.getBidOrderId().getMember();
map.put(member, orderBook);
logger.log(Level.INFO, "findLatestPrices orderbook price : {0}",
orderBook.getPrice());
logger.log(Level.INFO, "findLatestPrices orderbook bidorder member : {0}",
orderBook.getBidOrderId().getMember().getMemberId());
logger.log(Level.INFO, "findLatestPrices orderbook lastupdate : {0}",
orderBook.getLastUpdate());
}
...}
Я создаю EntityManager в вышеприведенном боба следующим образом:
@PersistenceContext
private EntityManager em;
Из протоколирования я могу видеть, что сессии вернуть данные, которые синхронизированы с базой данных, то есть единичные результаты, когда я планирующие два и т.д. Как вы можете видеть, что я пытался setHint для обновления кэша. Я также пробовал @Cacheable (false) на моем экземпляре OrderBook и @Cache (refreshAlways = true), но безрезультатно.
Я отправляю событие push в @PostPersist созданного объекта (OrderBook). Javascript обработчик событий в моей странице Xhtml затем вызывает следующий remotecommand:
<p:remoteCommand name="updateWidget"
autoRun="false"
actionListener="#{parliamentManager.findLatestPrices}"
update="resultDisplay"
onstart="onStart()"
oncomplete="onComplete()"
onsuccess="onSuccess()"
onerror="onError()">
<f:actionListener binding="#{parliamentManager.findTraders()}" />
<f:actionListener binding="# {parliamentManager.findPortfolios()}" />
</p:remoteCommand>
кажется, что часто результаты findLatestPrices не включают в себя последние объекты для всех портфеля заказов сессий. Возможно ли, что сущность не сохраняется сразу при вызове @PostPersist, работая над теорией о том, что push отправляется на некоторые сеансы до того, как объект полностью сохраняется и отражается JPA?
Чтобы продемонстрировать, я добавил простую командную кнопку для вызова updateWidget() вручную. Если сеанс не обновлен, и я нажимаю кнопку, он всегда обновляется до последних данных.
Спасибо, Zobbo
Вы пытались очистить кеш перед выполнением запроса 'em.getEntityManagerFactory(). GetCache(). EvictAll()' – simdevmon
Спасибо за ответ simdevmon. Я пробовал это, но это не имело никакого значения, к сожалению. – zobbo