powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / кэширование данных из БД
25 сообщений из 28, страница 1 из 2
кэширование данных из БД
    #38389305
Synchrophasotron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.
Передо мной стоит следующая задача:

существует независимый кусок базы данных (около 5 таблиц)который нужно ПОЛНОСТЬЮ закешировать и хранить в памяти для ускорения работы(причем кеш не должен быть распределенным так как надо будет всего одна).

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

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

Думаю есть какие-нибудь стандартные средства, которые заточенны под даную задачу ()
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389316
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данные нужно кешировать в том виде, в котором вы их используете. Там можно съэкономить ещё и на том что не надо данные конвертировать, если они закешированы.
Кеширование большой и сложный вопрос. Готовых фреймверков масса. Реализация зависит от того как вы работаете с БД и какие данные получаются в итоге из слоя работы с БД.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389320
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы стуктуру БД меняете без перезагрузки сервера? Кеш обычно хранит данные вычитаные из базы-не-важно-какой-структуры.
Поэтому структура БД на кеш влияет слабо.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389346
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У вас есть два пути:
1) Нафигачить кэш руками. По сути, это будет обычный HashMap. Потом в ваших Дао добавить запись/чтение. Из плюсов - легковесно и полностью под вашим кнтролем. Минусы: надо писать код, плюс обязательно правильно разруливать синхронизацию апдейтов кэша и транзакций СУБД.
2) Взять стороннее решение. Например - hazelcast. Минусы - лишняя зависимость в проекте. Плюсы: все уже написано за вас, поддержка транзакций есть, включая J2EE транзакции, вам надо только интегрировать это в свой проект.

Что вам ближе - решайте сами.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389378
Synchrophasotron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВы стуктуру БД меняете без перезагрузки сервера? Кеш обычно хранит данные вычитаные из базы-не-важно-какой-структуры.
Поэтому структура БД на кеш влияет слабо.

Blazkowicz во время изменения базы, сервер стопается.
А структура базы данных очень сильно влеяет написание рукописного кеша. замучеешься писать мепки для связи много ко многим
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389390
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SynchrophasotronBlazkowicz во время изменения базы, сервер стопается.

Отлично. Когда сервер запускается, то кеш заполняется из новой структуры данных. Нет?

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

Synchrophasotronзамучеешься писать мепки для связи много ко многим
Замучаетесь делать стабильный рукописный кеш вообще.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389403
Synchrophasotron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczSynchrophasotronBlazkowicz во время изменения базы, сервер стопается.

Отлично. Когда сервер запускается, то кеш заполняется из новой структуры данных. Нет?

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


сори я не игнорировал)) просто так получается данные используются в том же виде в каком храняться в базе.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389409
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchrophasotronда, так оно и есть, полностью загружаем данные из базы во время старта приложения.
просто так получается данные используются в том же виде в каком храняться в базе.
Всё равно не понимаю. Загружаем какой-то набор полей. Всё что загрузили - кешируем.
Появилось новое поле. Загружается теперь больше полей. Кешу абсолютно все равно каким там поля. Кешируется всё что вычиталось.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389428
Synchrophasotron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczSynchrophasotronда, так оно и есть, полностью загружаем данные из базы во время старта приложения.
просто так получается данные используются в том же виде в каком храняться в базе.
Всё равно не понимаю. Загружаем какой-то набор полей. Всё что загрузили - кешируем.
Появилось новое поле. Загружается теперь больше полей. Кешу абсолютно все равно каким там поля. Кешируется всё что вычиталось.

да именно так есть. Изолированный кусочек БД(данных в нем не очень много, но они ооочень интенсивно меняются), который полностью надо зекешировать, если появиться новое поле, кешируется и оно, если появиться новая табличка ее тоже надо закешировать
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389435
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchrophasotronда именно так есть. Изолированный кусочек БД(данных в нем не очень много, но они ооочень интенсивно меняются), который полностью надо зекешировать, если появиться новое поле, кешируется и оно, если появиться новая табличка ее тоже надо закешировать
Вот и напишите такой слой кеширования, который ничего не знает о структуре БД. Зачем кешу структура БД - не понятно.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389565
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Synchrophasotron,
Если это Hibernate, то почему бы не использовать кеш второго уровня? Выбрали провайдера, пометили классы и коллекции
Код: java
1.
2.
3.
4.
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class CacheEntity { ... }

, сделали select *, и все что нужно - в памяти.
По-моему, то, что надо, и код приложения при этом не меняется. На выбор куча провайдеров и стратегий.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389574
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraЕсли это Hibernate
Это ключевой момент :-) ТС так и не ответил, как он работает с БД.
Еще из вариантов добавить на сервере с базой ОЗУ и при достаточности объемов памяти и правильном тюнинге базы, она сама все закэширует.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389608
Synchrophasotron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimirivanraЕсли это Hibernate
Это ключевой момент :-) ТС так и не ответил, как он работает с БД.
Еще из вариантов добавить на сервере с базой ОЗУ и при достаточности объемов памяти и правильном тюнинге базы, она сама все закэширует.

вы обсолютно правы добавил некоторую информацию


база:
данные в одной таблице часто изменяются (таблица самая большая) и соответственно часто читаются(тип1)
все остальные таблицы изменяются не часто, но читаются часто(тип2)

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

данные остальных таблиц берется непосредственно из базы данных
на этом теряется много времени, именно этот момент хочется оптимизировать

как я хочу решить проблему:

я хочу сделать кэш с которым можно было работать как на подобии с базой данных, чтобы менять как можно меньше кода(поэтому рассматриваю в первую очередь in memory DB)

как это будет работать:
1) во время старта загрузить все данные из базы данных в кеш
2) при вызове метода DAO на изменение, проводить измение как в базе данных так и в кеше(чтобы данные были одни и те же как в кеше так и в БД)
3) чтение только из кеша

дополнительная информация
1) вызов каждого метода в DAO выполняется в одной транзакции
2) все изменения мы контролируем в дао
3) используется используем jdbc
4) только один инстанс приложения
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389633
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все ясно. Тогда ищите кэши, который вас удовлетворят. Можете отталкиваться от hazelcast для начала.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389641
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchrophasotronкак это будет работать:
1) во время старта загрузить все данные из базы данных в кеш
2) при вызове метода DAO на изменение, проводить измение как в базе данных так и в кеше(чтобы данные были одни и те же как в кеше так и в БД)
3) чтение только из кеша

Чем это лучше стандартной схемы. Если запись поменялась, дропаем из кеша и перечитываем из базы, если её нет в кеше?
Зачем делать изменения в кеше. Если дропнуть проще. А чтение из базы в кеш уже реализовано?


Synchrophasotron1) вызов каждого метода в DAO выполняется в одной транзакции

Оригинально.
Synchrophasotron2) все изменения мы контролируем в дао

Это как?

Synchrophasotron3) используется используем jdbc

Это значит что вычитаные данных хранятся в ResultSet или каком-то аналоге и вся остальная система работает с эти ResultSet?

Synchrophasotron4) только один инстанс приложения
Как это к теме относится? Имеется в виду что кластеризации не предвидится?
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389662
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczЧем это лучше стандартной схемы. Если запись поменялась, дропаем из кеша и перечитываем из базы, если её нет в кеше?
Зачем делать изменения в кеше. Если дропнуть проще. А чтение из базы в кеш уже реализовано?Ну скажем прямо, дроп из кэша это не стандартная схема. А вот write-thorough, про который говорит автор - вполне себе стандартное решение.
Плюсы ее использования очевидны:
1) Уменьшаем нагрузку на базу. Ведь если таблицу активно читают, то каждый cache miss может вылитьс даже не в одно, а в несколько чтений.
2) Как вы будете разруливать ситуацию, когда кто-то пытается прочитать несуществующее значение? Например, когда ридеру нужен ключ A, которого никогда не было базе? Вам для этого придется лезть в БД. А в случае write-through с полностью прогретым на старте кэшем (а полный прогрев - это условие автора), у вас кэш всегда консистентен с СУБД, то есть вы можете гарантированно сказать, каких ключей нет не обращаюсь в СУБД.
3) Наконец, write-through подход позволяет полностью разделить читателей и писателей. Поэтому здесь концептуально подойдет банальный ReadWriteLock (именно концептульно, как идея), когда ридеры гарантирвоанно друг друга не блокируют, им никогда не нужен эксклюзивный доступ, а у врайтера есть экслюзивный доступ, если нужно обновить какой-то ключ. А в вашем случае ридерам время от времени будет требоваться брать эксклюзивный лок на ключе, что усложнит логику и увеличит контеншн, ибо надо брать в расчет следующую ситуацию:
WRITER 1: записал К = 1, удалил ключ из кэша
READER 1: прочитал К, увидел K = 1
WRITER 1: записал K = 2
READER 2: прочитал K, увидел K = 2
READER 2: положил K = 2 в кэш
READER 1: положил K = 1 в кэш

Все, приехали, race condition, в СУБД у нас 2, а в кэше 1. Поэтому удаление ключей из кэше при обновлении - нифига не простое решение.

Так что write-through здесь выигрывает по всем параметрам, имею соизмеримую сложность имплементации.

Hazelcast, Infinispan - там есть все, что нужно.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389677
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchrophasotron,

А зачем, что-то кешировать? Этим занимается база данных. Или вы обращаетесь к ней через Интернет?
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389681
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Relic HunterА зачем, что-то кешировать? Этим занимается база данных. Или вы обращаетесь к ней через Интернет?Любое обращение к СУБД - это как минимум сериализация-десериализация, а как максимум - еще и TCP запрос(ы) на удаленный компьютер. Так что никакие кэши на стороне СУБД здесь не спасут.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389692
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachЛюбое обращение к СУБД - это как минимум сериализация-десериализация, а как максимум - еще и TCP запрос(ы) на удаленный компьютер. Так что никакие кэши на стороне СУБД здесь не спасут.Вы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389698
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Relic HunterВы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою.Коллега, вы можете добиться самого оптимального в мире плана для конкретного запроса на конкретной СУБД, но при этом любой вызов этого запроса из другого процесса будет в десятки, если не сотни раз медленнее, чем просто взять объект из кэша того же процесса. На то есть объективные причины: сериализация и RPC.
Почему автор пришел к необходимости кэширования - вопрос к нему. Но в любом случае, я думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389739
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synchrophasotronданные остальных таблиц берется непосредственно из базы данных
на этом теряется много времени, именно этот момент хочется оптимизировать
Пока не совсем ясно, но складывается впечатление, что Вы пытаетесь решить проблему не с того конца. Расскажите еще про Вашу систему:
- Сколько обращений происходит в секунду/минуту/час к этим таблицам?
- Каков порядок этих потерь времени, борьба идет за миллисекунды/сотни миллисекунд/секунды/минуты? Каковы суммарные объемы всех ваших таблиц обоих типов?
- Какое используется железо на серверах, количество доступной ОЗУ?
- Верно ли я понял, что за утрату части данных в случае каких либо неполадок Вы особо не переживаете? Да и в целом Вам ACID не особо нужен?
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389747
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoachRelic HunterВы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою.Коллега, вы можете добиться самого оптимального в мире плана для конкретного запроса на конкретной СУБД, но при этом любой вызов этого запроса из другого процесса будет в десятки, если не сотни раз медленнее, чем просто взять объект из кэша того же процесса. На то есть объективные причины: сериализация и RPC.
Почему автор пришел к необходимости кэширования - вопрос к нему. Но в любом случае, я думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса.
Я думаю Вы не будете спорить с тем, что если перевести эту относительную разницу в разы из-за всевозможных накладных расходов в абсолютные числа, то в худшем случае получится десяток другой миллисекунд. И чтобы ее прочувствовать надо иметь сотни/тысячи обращений в секунду.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389756
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
just_vladimir ,
Откуда вы взяли такие цифры? Разница может какой-угодно. Может быть, там СУБД и приложение на одной машине, общаются через shared memory, запросы маленькие и хорошо заоптимизированные, и т.п. В этом случае разница во времени будет не существенной.
А может быть СУБД и приложение разделены медленной сетью, запросы тяжелые, на апдейтах сидят пессимистичные блокировки, а пул соединений ограничен и не может быть расширен, а потоков, тебующих свой коннект в разы больше, чем коннектов в пуле. Тогда разница по сравнению с закешированным вариантом будет измеряться не то, что миллисекундами, а минутами, а то и десятками минут. Поэтому, не зная всех деталей, мы можем только гадать, что именно побудило автора прийти к кэшированию.

Но сама по себе идея кэширования является естественной и нормальной практикой. Тот же Хибер весь пронизан кэшами. Более того, учитывая то, что автору не требуется никаких серьезных заморочек вроде партицирования/реплицирования/write-behind и прочей фигни, нет никаких проблем взять какой-нибудь Infinispan, и запилить его в свой проект за несколько часов. Поэтому нет особых причин лезть в душу автору, и выпытывать у него действительно ли ему нужен кэш.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389814
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,
Вы, конечно, извините, но выдумыванием занимаетесь именно Вы. Relic Hunter верно указал, что сначала надо понять причину тормозов (сеть, не оптимальные настройки, не оптимальные запросы), а потом уже городить кэширование. На что Вы начали придумывать, про различные возможные оверхеды:
DEVcoachя думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса.
Все подобные оверхеды на практике начинают оказывать влияние только при весьма значительных нагрузках.
...
Рейтинг: 0 / 0
кэширование данных из БД
    #38389861
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach А вот write-thorough, про который говорит автор - вполне себе стандартное решение.
Надо смотреть на структуры, конечно. Но у меня масса вопросов. Запись в кеш тогда должна быть транзакционной. Так чтобы ошибка в базе откатывала и запись в кеш. Я бы посмотрел как автор реализует транзакционный кэш на HashMap. :)
Второе это запись в кэш и запись в базу - не одно и то же. Что делать если ключи генерируются в базе?

DEVcoachПлюсы ее использования очевидны:
Они могут быть очевидны, только если весь процесс работы системы с БД понятен. У нас же тут на форуме лишь какие-то мутные и обрывочные сведения.

DEVcoach1) Уменьшаем нагрузку на базу. Ведь если таблицу активно читают, то каждый cache miss может вылитьс даже не в одно, а в несколько чтений.

Возможно.

DEVcoach2) Как вы будете разруливать ситуацию, когда кто-то пытается прочитать несуществующее значение? Например, когда ридеру нужен ключ A, которого никогда не было базе? Вам для этого придется лезть в БД. А в случае write-through с полностью прогретым на старте кэшем (а полный прогрев - это условие автора), у вас кэш всегда консистентен с СУБД, то есть вы можете гарантированно сказать, каких ключей нет не обращаюсь в СУБД.

Гарантии того что кэш консистентен с СУБД под большим вопросом.

DEVcoachWRITER 1: записал К = 1, удалил ключ из кэша
READER 1: прочитал К, увидел K = 1
WRITER 1: записал K = 2
READER 2: прочитал K, увидел K = 2
READER 2: положил K = 2 в кэш
READER 1: положил K = 1 в кэш

Тут я вообще смысла не уловил. В кеш всегда попадают актуальные данные из Базы. Если кто-то вычитал предыдущее значение из кеша, то это ни на что не влияет. Он мог это же сделать и до записи в кеш.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / кэширование данных из БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]