Кэширование данных Java-приложения, как остановить его, чтобы данные не устарели! - PullRequest
2 голосов
/ 22 марта 2011

Привет, у меня проблема.Мой (я предполагаю) уровень персистентности кэширует мои результаты, поэтому, когда я обновляю базу данных вне моего приложения, данные остаются устаревшими.

однако, это только кеширование половину времени, я надеюсь, что это имеет смысл,

У меня есть класс

@Entity
@Table(name = "PROVINCE")
public class Province implements Serializable {

@Id
@GeneratedValue
int id;

String provinceName;

String provinceMoto;


Buildings buildings;


Units units;


Person person;

.... etc

сейчас, если я обновлю любые данные, которые неЕсли это не ссылка на объект класса, например «имя провинции», то данные в моем приложении корректны и сразу же обновляются.тем не менее, внутренние объекты, такие как «здания», этого не делают, и я не могу понять, как, если я делаю жесткое обновление, например, повторное развертывание своего приложения, тогда данные свежие.

Я получаю свою провинцию из базы данных.здесь:

Query query = manager.createQuery("select p from Province p where p.person = :query");
        query.setHint("toplink.refresh", "true");
        query.setParameter("query", p);

        province = (Province) query.getSingleResult();

так, как мне заставить это делать также внутренние объекты этого класса, то есть "человека" зданий ", также обновлять.

Мой уровень персистентности является основой toplink, и я исправил свою предыдущую проблему, которая не заключалась в обновлении данных.и этот первый пост здесь (это еще одна страница переполнения стека)

спасибо за любую помощь.я надеюсь, что я достаточно хорошо объяснил свою проблему

[РЕДАКТИРОВАТЬ: как если бы я не использовал эту платформу, было бы проще объединить таблицы в БД и заново заполнить данные в новой переменной, но я не]

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Это вопрос "Док, мне больно, когда я ..." "Не делай этого".

Если вы обновляете базу данных за обратной стороной Toplink, то вам нужно обновить свойданные, как вы сделали.

Каждый раз, когда вы используете запрос типа «выбрать» в JPA, он попадет в базу данных.Но, как вы узнали, для связанных объектов он просто извлекает их ключи из БД, а затем использует кэшированную версию, а не бьет по базе данных.

У Toplink есть 2 кэша.Кэш уровня 1 и уровня 2.Кэш уровня 1 - это использование кэша на основе транзакций для текущего сеанса.Кэш 2-го уровня аналогичен, но имеет широкое применение и глобальный охват.Кэш 2-го уровня - это то, к чему вы, скорее всего, натолкнетесь.

Поэтому вам нужно будет либо продолжать использовать подсказку обновления Toplink, либо полностью отключить кэш 2-го уровня.

0 голосов
/ 22 марта 2011

После того, как вы обновите данные в БД, создайте свой объект значений (также дочерние объекты значений) или создайте заново значения со значениями сбоя.Надеюсь, это решит вашу проблему.

...