Требуется ли для EHCache метод put (), чтобы изменения в экземпляре отражали (XA)? - PullRequest
4 голосов
/ 14 ноября 2010


Я начал работать с EHCache в качестве транзакционного кэша (XAResource) в пользовательской транзакции JTA, и я вижу нечто странное, по крайней мере, на мой взгляд, и я хотел бы понять,мое "видение" неверно или мое понимание.
Следующий код вернет false

ut = getUserTransaction();
ut.begin();
MyClass a = myChache.get(key).getValue();
a.changeSomeInnerReferrence(newRefference);
ut.commit();
ut = getUserTransaction();
ut.begin();
MyClass b = myChache.get(key).getValue();
ut.commit();
return a.equals(b);

Предположим, что MyClass имеет член типа MyOtherClass и что changeSomeInnerReferrence изменяетсяссылка из текущего значения на параметр;Также предположим, что equals учитывает этот член.
Я заметил, что если я не добавлю myChache.put(key,a) до ut.commit(), приведенный выше код вернет false.

Почему это?Это общее поведение кешей?Я думаю, что изменение внутренней ссылки будет распространяться в кэш после вызова commit.

Спасибо,
Итай

1 Ответ

2 голосов
/ 08 февраля 2011

Немного предисловия, я не использовал EHCache в контексте JTA.Возможно, он делает что-то умное в пользовательской транзакции, но я в этом сомневаюсь.

Общее правило состоит в том, что элемент, возвращаемый cache.get (key), имеет значение.Изменения в нем не обязательно отражаются в базовом кэше.Причины этого становятся достаточно ясными, если вы представите, что у вас вообще нет хранилища в памяти, а есть только хранилище на диске.Хранилище дисков требует сериализации записей кэша, поэтому пара операций put / get вернет вам другой экземпляр Java.Кроме того, в такой ситуации неясно, когда любые изменения в экземпляре, возвращенном cache.get (), будут / должны быть записаны обратно на диск.Использование put () проясняет это.

В конце концов, вещь, которую вы получаете от get (), является вашей ответственностью.Вы говорите, что EHCache вступит во владение, сказав put ().

...