Задать вопрос
@fantomasdnb
Java разработчик, BPM

С помощью чего реализовать кэширование SQL-запросов для разных представлений таблицы в одном месте (Java+SWT/JFace+Hibernate)?

Здравствуйте. И так передо мной стоит примерно следующая задача.

В Desktop-приложении есть несколько таблиц. Все они отображают данные из одной таблицы в БД, но различаются набором выбранных колонок для отображения и критериями выбора записей (и как следствие разными строками). И есть желание(возможно не рациональное) кэшировать запрошенные данные в одной модели, храня для каждого представления номера строк и колонок.

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

Работа с данной ведётся с помощью Hibernate, в которой пока разбираюсь слабо. И отображается таблица в TableViewer (SWT/JFace).

Отсюда вопросы:
Есть ли готовые решения для такой архитектуры, или полезные инструменты для этого?
Рационально ли так делать, если скорее всего строки часто будут запрашиваться повторно?
Что вообще почитать можно? Я читал про методы кэширования разные - это всё общие слова и не помогают в решении.

В библиотеке Google Guava нашел классы Cache и LoadingCache, которые частично решают проблему. Но существуют некие противоречия:
1) строки удаляются только по устариванию, без возможности поставить дополнительное условие, например, принудительно оставить в кэше, даже если данные устарели;
2) удаляется вся строка, не смотря на то, что запись может устареть для одного предствления и не устареть для другого.
  • Вопрос задан
  • 3124 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Во первых, кеш запросов и кеш данных приложения, возможно и кеш отрендереных кусков страницы - совершенно разные вещи, которые , мне кажется, Вы смешали в одну кучу.

1) В hibernate есть свой кеш запросов, который настраивается кучей разных способов для работы с разными кешами. О! Даже хабра-статья оказывается есть - habrahabr.ru/post/135176

2) Устаревание записей и прочее - прерогатива кеша работы с базой
3) Если какие-то данные должны удаляться со временем, то есть политики типа LRU, для кеша данных, возможно, придется использовать не только кеш запросов, но и кеш отрендерренных страниц.

Со статьи на хабре найдете описание основных библиотек кеширования...
Ответ написан
@bazarnazar
Если кэша первого уровня достаточно(работает в рамках одной сессии) то делать ничего не надо. Если нужен второй уровень(на SessionFactory), то берете какую-нибудь имплементацию кэша для хибернэйта типа ehcache, infinispan, hazelcast и так далее, и включаете. Вот хороший гайд для ehcache

P.S. А зачем вам обновляемые отображения, если они отличаются только выборкой столбцов? оставьте все в одной таблице, и создайте несколько разных Еntity к одной таблице с нужными полями в каждой. разгрузите базу от updatable view
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы