Я разрабатываю проект с использованием JPA и Hibernate, и у меня есть два потока:
- Тема A: всегда читает и выводит различия
- Поток B: имеет несколько операций записи и одну транзакцию, которая завершается после завершения записи данных
Если я удаляю данные или вставляю новые данные из / в базу данных, после принятия транзакций из потока B, в потоке A я вижу различия в том, что некоторые данные были удалены или добавлены.
Моя проблема в том, что я обновляю существующие данные: после фиксации поток А не видит различий, если только я не очищаю EntityManager после каждого чтения.
Это свойства объекта управления сущностями:
EntityManager em = EMF.createEntityManager();
em.setProperty("hibernate.connection.autocommit", false);
em.setProperty("hibernate.connection.isolation", 2); // read committed
em.setProperty("javax.persistence.cache.storeMode", javax.persistence.CacheStoreMode.BYPASS);
em.setProperty("javax.persistence.cache.retrieveMode", javax.persistence.CacheRetrieveMode.BYPASS);
em.setProperty("hibernate.cache.use_query_cache", false);
em.setProperty("hibernate.cache.use_second_level_cache", false);
Другое дело, что я настроил регистратор как показано ниже:
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
чтобы показать мне все sql и установленные / возвращенные значения. Я заметил, что при первом чтении он читает каждое отдельное значение из базы данных, а после второго раза читает только идентификаторы и новые вставленные значения в случае вставки данных ... но при обновлении ничего не выглядит иначе.
Итак, учитывая, что я не использую кэш второго уровня Hibernate и что я обхожу режим хранения и получения для кеша сеансов, что происходит точнее, потому что я не могу понять и как я могу решить эту проблему без очистки контекст постоянства после каждого чтения?
Спасибо.