Кэш для Java с транзакциями - PullRequest
3 голосов
/ 21 марта 2012

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

Однако она должна поддерживать транзакции, так как в случае сбоя изменения в базе данных изменения, внесенные в кэш, также откатываются.

Я слышал о JTAно это кажется слишком много для того, что мне нужно.Было бы неплохо вручную откатить кеш, если в транзакции базы данных возникло исключение SQLException.

Есть ли варианты?

Если нет, может кто-нибудь указать мне хороший учебник по JTA?например.примеры и какие пакеты / классы требуются.Примечание. Я создаю фреймворк, чтобы он мог работать автономно без контейнера приложения.

РЕДАКТИРОВАТЬ:

Забыл 1 очень важный вопрос:

Кэшируемые объекты являются неизменяемыми!Обновить означает заменить его новым объектом, равным старому (метод равенства на основе идентификатора).

РЕДАКТИРОВАТЬ 2:

Написал JPA вместо JTA ...

РЕДАКТИРОВАТЬ 3:

Объяснение, почему не работает простая Карта:

У меня есть 2 типа сущностей.Я назову их Соединением и Элементом.Соединение может состоять из нескольких элементов, и каждый элемент может появляться в нескольких соединениях.Элементы управляются моей структурой.Например, только соединения могут быть добавлены напрямую.Пользователь добавляет новое соединение, указав его элементы.Фреймворк либо выбирает и покидает элемент и связывает его с новым составным элементом, либо создает новый элемент.

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

Поэтому, если новое соединение было добавлено или обновлено, затронутые элементы в кэше также должны быть обновлены.

Решение:

Сделал то, что я сказал в комментариях: - сохранить идентификаторы (= целые числа) всех измененных объектов в памяти, а затем обновлять только измененные после фиксации транзакции базы данных.

private void updateSearchCache(Collection<String> changedIds,
        Connection connection) {

    synchronized (searchCache) { 
        for (String id : changedIds) {
            Object myObject = getSearchObject(id, connection);
            searchCache.put(id, myObject);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Разве вы не можете просто поместить свои данные в Map после того, как транзакция зафиксирована в базе данных, не так ли?

Итак, ваша Map будет содержать только те данные, которыеуже в базе данных.

0 голосов
/ 21 марта 2012

Транзакционное кэширование возможно с infinispan .Хотя он спроектирован как кластерный кеш, он может легко запускаться на одной машине .Кеш-API расширяет java.util.Map и прост в использовании.

0 голосов
/ 21 марта 2012

Berkeley DB может быть использован для создания таблиц в памяти и имеет поддержку транзакций .

Это хороший выборВы хотите сохранить сопоставления blob-> blob, но это не кэш объектов.

...