|
|
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. Передо мной стоит следующая задача: существует независимый кусок базы данных (около 5 таблиц)который нужно ПОЛНОСТЬЮ закешировать и хранить в памяти для ускорения работы(причем кеш не должен быть распределенным так как надо будет всего одна). Первое что приходит на ум это создать мепки . когда запускается приложение закачивать все данные в них а при изменение вызове методов ДАО менять так же данные в кеше. но данные подход требует написание значительно объема когда, а так же при изменение структуры БД(хоть это и маловероятно) значительной переписки когда. Думаю есть какие-нибудь стандартные средства, которые заточенны под даную задачу () ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:08:02 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Данные нужно кешировать в том виде, в котором вы их используете. Там можно съэкономить ещё и на том что не надо данные конвертировать, если они закешированы. Кеширование большой и сложный вопрос. Готовых фреймверков масса. Реализация зависит от того как вы работаете с БД и какие данные получаются в итоге из слоя работы с БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:13:16 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Вы стуктуру БД меняете без перезагрузки сервера? Кеш обычно хранит данные вычитаные из базы-не-важно-какой-структуры. Поэтому структура БД на кеш влияет слабо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:14:06 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
У вас есть два пути: 1) Нафигачить кэш руками. По сути, это будет обычный HashMap. Потом в ваших Дао добавить запись/чтение. Из плюсов - легковесно и полностью под вашим кнтролем. Минусы: надо писать код, плюс обязательно правильно разруливать синхронизацию апдейтов кэша и транзакций СУБД. 2) Взять стороннее решение. Например - hazelcast. Минусы - лишняя зависимость в проекте. Плюсы: все уже написано за вас, поддержка транзакций есть, включая J2EE транзакции, вам надо только интегрировать это в свой проект. Что вам ближе - решайте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:25:56 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВы стуктуру БД меняете без перезагрузки сервера? Кеш обычно хранит данные вычитаные из базы-не-важно-какой-структуры. Поэтому структура БД на кеш влияет слабо. Blazkowicz во время изменения базы, сервер стопается. А структура базы данных очень сильно влеяет написание рукописного кеша. замучеешься писать мепки для связи много ко многим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:41:15 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
SynchrophasotronBlazkowicz во время изменения базы, сервер стопается. Отлично. Когда сервер запускается, то кеш заполняется из новой структуры данных. Нет? SynchrophasotronА структура базы данных очень сильно влеяет написание рукописного кеша. А почему вы игнорируете остальные мои коментарии. Пишу же. Кешируйте данные, а не базу. Synchrophasotronзамучеешься писать мепки для связи много ко многим Замучаетесь делать стабильный рукописный кеш вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:46:35 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
BlazkowiczSynchrophasotronBlazkowicz во время изменения базы, сервер стопается. Отлично. Когда сервер запускается, то кеш заполняется из новой структуры данных. Нет? да, так оно и есть, полностью загружаем данные из базы во время старта приложения. BlazkowiczSynchrophasotronА структура базы данных очень сильно влеяет написание рукописного кеша. А почему вы игнорируете остальные мои коментарии. Пишу же. Кешируйте данные, а не базу. сори я не игнорировал)) просто так получается данные используются в том же виде в каком храняться в базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:51:15 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotronда, так оно и есть, полностью загружаем данные из базы во время старта приложения. просто так получается данные используются в том же виде в каком храняться в базе. Всё равно не понимаю. Загружаем какой-то набор полей. Всё что загрузили - кешируем. Появилось новое поле. Загружается теперь больше полей. Кешу абсолютно все равно каким там поля. Кешируется всё что вычиталось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 16:53:23 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
BlazkowiczSynchrophasotronда, так оно и есть, полностью загружаем данные из базы во время старта приложения. просто так получается данные используются в том же виде в каком храняться в базе. Всё равно не понимаю. Загружаем какой-то набор полей. Всё что загрузили - кешируем. Появилось новое поле. Загружается теперь больше полей. Кешу абсолютно все равно каким там поля. Кешируется всё что вычиталось. да именно так есть. Изолированный кусочек БД(данных в нем не очень много, но они ооочень интенсивно меняются), который полностью надо зекешировать, если появиться новое поле, кешируется и оно, если появиться новая табличка ее тоже надо закешировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 17:00:27 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotronда именно так есть. Изолированный кусочек БД(данных в нем не очень много, но они ооочень интенсивно меняются), который полностью надо зекешировать, если появиться новое поле, кешируется и оно, если появиться новая табличка ее тоже надо закешировать Вот и напишите такой слой кеширования, который ничего не знает о структуре БД. Зачем кешу структура БД - не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 17:02:36 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotron, Если это Hibernate, то почему бы не использовать кеш второго уровня? Выбрали провайдера, пометили классы и коллекции Код: java 1. 2. 3. 4. , сделали select *, и все что нужно - в памяти. По-моему, то, что надо, и код приложения при этом не меняется. На выбор куча провайдеров и стратегий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 18:32:09 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
ivanraЕсли это Hibernate Это ключевой момент :-) ТС так и не ответил, как он работает с БД. Еще из вариантов добавить на сервере с базой ОЗУ и при достаточности объемов памяти и правильном тюнинге базы, она сама все закэширует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 18:44:33 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
just_vladimirivanraЕсли это Hibernate Это ключевой момент :-) ТС так и не ответил, как он работает с БД. Еще из вариантов добавить на сервере с базой ОЗУ и при достаточности объемов памяти и правильном тюнинге базы, она сама все закэширует. вы обсолютно правы добавил некоторую информацию база: данные в одной таблице часто изменяются (таблица самая большая) и соответственно часто читаются(тип1) все остальные таблицы изменяются не часто, но читаются часто(тип2) на данный момент реализовано: кэшируется только одна таблица в hashMap (тип1). и через промежуток времени данные из этого кеша синхронизируются с базой данной(запись работает через jdbs бач) данный кусок кода полностью удовлетворяет по производительности. данные остальных таблиц берется непосредственно из базы данных на этом теряется много времени, именно этот момент хочется оптимизировать как я хочу решить проблему: я хочу сделать кэш с которым можно было работать как на подобии с базой данных, чтобы менять как можно меньше кода(поэтому рассматриваю в первую очередь in memory DB) как это будет работать: 1) во время старта загрузить все данные из базы данных в кеш 2) при вызове метода DAO на изменение, проводить измение как в базе данных так и в кеше(чтобы данные были одни и те же как в кеше так и в БД) 3) чтение только из кеша дополнительная информация 1) вызов каждого метода в DAO выполняется в одной транзакции 2) все изменения мы контролируем в дао 3) используется используем jdbc 4) только один инстанс приложения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 19:24:57 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Все ясно. Тогда ищите кэши, который вас удовлетворят. Можете отталкиваться от hazelcast для начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 19:50:12 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotronкак это будет работать: 1) во время старта загрузить все данные из базы данных в кеш 2) при вызове метода DAO на изменение, проводить измение как в базе данных так и в кеше(чтобы данные были одни и те же как в кеше так и в БД) 3) чтение только из кеша Чем это лучше стандартной схемы. Если запись поменялась, дропаем из кеша и перечитываем из базы, если её нет в кеше? Зачем делать изменения в кеше. Если дропнуть проще. А чтение из базы в кеш уже реализовано? Synchrophasotron1) вызов каждого метода в DAO выполняется в одной транзакции Оригинально. Synchrophasotron2) все изменения мы контролируем в дао Это как? Synchrophasotron3) используется используем jdbc Это значит что вычитаные данных хранятся в ResultSet или каком-то аналоге и вся остальная система работает с эти ResultSet? Synchrophasotron4) только один инстанс приложения Как это к теме относится? Имеется в виду что кластеризации не предвидится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 19:57:23 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
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 - там есть все, что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 20:36:58 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotron, А зачем, что-то кешировать? Этим занимается база данных. Или вы обращаетесь к ней через Интернет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 21:01:33 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Relic HunterА зачем, что-то кешировать? Этим занимается база данных. Или вы обращаетесь к ней через Интернет?Любое обращение к СУБД - это как минимум сериализация-десериализация, а как максимум - еще и TCP запрос(ы) на удаленный компьютер. Так что никакие кэши на стороне СУБД здесь не спасут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 21:08:24 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
DEVcoachЛюбое обращение к СУБД - это как минимум сериализация-десериализация, а как максимум - еще и TCP запрос(ы) на удаленный компьютер. Так что никакие кэши на стороне СУБД здесь не спасут.Вы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 21:24:15 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Relic HunterВы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою.Коллега, вы можете добиться самого оптимального в мире плана для конкретного запроса на конкретной СУБД, но при этом любой вызов этого запроса из другого процесса будет в десятки, если не сотни раз медленнее, чем просто взять объект из кэша того же процесса. На то есть объективные причины: сериализация и RPC. Почему автор пришел к необходимости кэширования - вопрос к нему. Но в любом случае, я думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 21:35:33 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
Synchrophasotronданные остальных таблиц берется непосредственно из базы данных на этом теряется много времени, именно этот момент хочется оптимизировать Пока не совсем ясно, но складывается впечатление, что Вы пытаетесь решить проблему не с того конца. Расскажите еще про Вашу систему: - Сколько обращений происходит в секунду/минуту/час к этим таблицам? - Каков порядок этих потерь времени, борьба идет за миллисекунды/сотни миллисекунд/секунды/минуты? Каковы суммарные объемы всех ваших таблиц обоих типов? - Какое используется железо на серверах, количество доступной ОЗУ? - Верно ли я понял, что за утрату части данных в случае каких либо неполадок Вы особо не переживаете? Да и в целом Вам ACID не особо нужен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 22:49:57 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
DEVcoachRelic HunterВы уже определили, что СУБД или сеть у вас узкое место? Если да, то в первую очередь нужно дергать админстраторов сетей и СУБД этих самых, а не перекладывать их головную боль на свою.Коллега, вы можете добиться самого оптимального в мире плана для конкретного запроса на конкретной СУБД, но при этом любой вызов этого запроса из другого процесса будет в десятки, если не сотни раз медленнее, чем просто взять объект из кэша того же процесса. На то есть объективные причины: сериализация и RPC. Почему автор пришел к необходимости кэширования - вопрос к нему. Но в любом случае, я думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса. Я думаю Вы не будете спорить с тем, что если перевести эту относительную разницу в разы из-за всевозможных накладных расходов в абсолютные числа, то в худшем случае получится десяток другой миллисекунд. И чтобы ее прочувствовать надо иметь сотни/тысячи обращений в секунду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 23:01:51 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
just_vladimir , Откуда вы взяли такие цифры? Разница может какой-угодно. Может быть, там СУБД и приложение на одной машине, общаются через shared memory, запросы маленькие и хорошо заоптимизированные, и т.п. В этом случае разница во времени будет не существенной. А может быть СУБД и приложение разделены медленной сетью, запросы тяжелые, на апдейтах сидят пессимистичные блокировки, а пул соединений ограничен и не может быть расширен, а потоков, тебующих свой коннект в разы больше, чем коннектов в пуле. Тогда разница по сравнению с закешированным вариантом будет измеряться не то, что миллисекундами, а минутами, а то и десятками минут. Поэтому, не зная всех деталей, мы можем только гадать, что именно побудило автора прийти к кэшированию. Но сама по себе идея кэширования является естественной и нормальной практикой. Тот же Хибер весь пронизан кэшами. Более того, учитывая то, что автору не требуется никаких серьезных заморочек вроде партицирования/реплицирования/write-behind и прочей фигни, нет никаких проблем взять какой-нибудь Infinispan, и запилить его в свой проект за несколько часов. Поэтому нет особых причин лезть в душу автору, и выпытывать у него действительно ли ему нужен кэш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 23:14:35 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Вы, конечно, извините, но выдумыванием занимаетесь именно Вы. Relic Hunter верно указал, что сначала надо понять причину тормозов (сеть, не оптимальные настройки, не оптимальные запросы), а потом уже городить кэширование. На что Вы начали придумывать, про различные возможные оверхеды: DEVcoachя думаю, вы не будете спорить с тем, что взять готовый объект из адресного пространства того же процесса во много раз быстрее, чем получить его из другого процесса. Все подобные оверхеды на практике начинают оказывать влияние только при весьма значительных нагрузках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 00:34:27 |
|
||
|
кэширование данных из БД
|
|||
|---|---|---|---|
|
#18+
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 в кэш Тут я вообще смысла не уловил. В кеш всегда попадают актуальные данные из Базы. Если кто-то вычитал предыдущее значение из кеша, то это ни на что не влияет. Он мог это же сделать и до записи в кеш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2013, 08:29:30 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38389435&tid=2128646]: |
0ms |
get settings: |
17ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
45ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
103ms |
get tp. blocked users: |
2ms |
| others: | 294ms |
| total: | 525ms |

| 0 / 0 |
