EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 08:54
Оценка:
Привет всем . Такую проблему никак не могу решить...
Вобщем, есть n-пользователей какой-либо системы. Все пользователи работают с базой данных, причём статистика указывает на то, что активно используется только часть базы данных. Логично предположить, что для оптимизации работы сервера можно было бы кэшировать такие данные в оперативную память, как не крути, а работа с оперативной памятью по скорости опережает все остальные источники данных... Теперь вопрос: как осуществить такое кэширование ? (планировал сделать это с помощью EJB, но , пока не нашёл решение данной проблемы...) Прошу помощи
Re: EJB и кэширование
От: Michael_Y Украина  
Дата: 18.12.06 09:08
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>Привет всем . Такую проблему никак не могу решить...

ALE>Вобщем, есть n-пользователей какой-либо системы. Все пользователи работают с базой данных, причём статистика указывает на то, что активно используется только часть базы данных. Логично предположить, что для оптимизации работы сервера можно было бы кэшировать такие данные в оперативную память, как не крути, а работа с оперативной памятью по скорости опережает все остальные источники данных... Теперь вопрос: как осуществить такое кэширование ? (планировал сделать это с помощью EJB, но , пока не нашёл решение данной проблемы...) Прошу помощи

Надо реализовать кэширование самому или взять готовую библиотеку (ehcache, oscache, TreeCache). В любом случае надо написать прослойку (в виде DAO-объектов), в которых реализуется логика кеширования. Или просто переписать весь код, где происходит получение данных, добавив во все места поддержку кэша
Re: EJB и кэширование
От: LDimas Россия  
Дата: 18.12.06 09:14
Оценка:
Если использовать Hibernate то решение — Second Level Cache.
О том как его использовать, можно почитать в Hibernate Reference раздел 19.2
Re[2]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 09:56
Оценка:
Здравствуйте, Michael_Y, Вы писали:

M_Y>Здравствуйте, ALER_PROG, Вы писали:


ALE>>Привет всем . Такую проблему никак не могу решить...

ALE>>Вобщем, есть n-пользователей какой-либо системы. Все пользователи работают с базой данных, причём статистика указывает на то, что активно используется только часть базы данных. Логично предположить, что для оптимизации работы сервера можно было бы кэшировать такие данные в оперативную память, как не крути, а работа с оперативной памятью по скорости опережает все остальные источники данных... Теперь вопрос: как осуществить такое кэширование ? (планировал сделать это с помощью EJB, но , пока не нашёл решение данной проблемы...) Прошу помощи

M_Y> Надо реализовать кэширование самому или взять готовую библиотеку (ehcache, oscache, TreeCache). В любом случае надо написать прослойку (в виде DAO-объектов), в которых реализуется логика кеширования. Или просто переписать весь код, где происходит получение данных, добавив во все места поддержку кэша

Ну , как бы, понятно, что это будет реализовано мной . Просто для меня , узким местом стало то, В ЧЁМ ЭТО ХРАНИТЬ ! То есть нужен некий объект, который ПОСТОЯННО находится в памяти (именно в оперативной) и к которому возможен доступ всеми пользователями . То есть что-то вроде глобального хранилища данных , но в оперативной памяти, а не в БД...
Re[3]: EJB и кэширование
От: LDimas Россия  
Дата: 18.12.06 10:03
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>Ну , как бы, понятно, что это будет реализовано мной .


А не лучше ли взять готовое решение, да посмотреть как работает? Вот про кеш hibernate я писал уже.
Re[2]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 10:03
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Если использовать Hibernate то решение — Second Level Cache.

LD>О том как его использовать, можно почитать в Hibernate Reference раздел 19.2
Вы этим пользовались ?...точнее, к скэшированным данным (ОБЩИМ ДАННЫМ, ГЛОБАЛЬНЫМ) смогут получить досутп все пользователи системы ?
Re[4]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 11:01
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Здравствуйте, ALER_PROG, Вы писали:


ALE>>Ну , как бы, понятно, что это будет реализовано мной .


LD>А не лучше ли взять готовое решение, да посмотреть как работает? Вот про кеш hibernate я писал уже.

А есть какие-то альтернативные методы решения данной проблемы ? Скажем , если не использовать какие-либо источники данных... Скажем, просто, массив данных, который доступен всем пользователям....и т.п. То есть какие-то глобальные данные , которые не относятся к какому-либо источнику...Просто накапливаются в процессе работы и используются совместно...
Re[3]: EJB и кэширование
От: aka50 Россия  
Дата: 18.12.06 11:02
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>Здравствуйте, LDimas, Вы писали:


LD>>Если использовать Hibernate то решение — Second Level Cache.

LD>>О том как его использовать, можно почитать в Hibernate Reference раздел 19.2
ALE>Вы этим пользовались ?...точнее, к скэшированным данным (ОБЩИМ ДАННЫМ, ГЛОБАЛЬНЫМ) смогут получить досутп все пользователи системы ?


Для того, чтобы ответить на ваш вопрос, необходимо знать архитектуру системы.
1. Как устроено взаимодействие пользователей с системой (orm jdbc ejb)?
2. Где конкретно располагается "оперативная память" и как предполагается доступ
к это "памяти" n пользователей.

Проблема эффективной реализации актуальности данных в распределенных системах — та еще
задачка... Вы уверены, что без теоретических знаний по этой теме готовы сделать свою
реализацию?

Обычно это делается:
1. Тонкий клиент: Все кеширование происходит на сервере приложений,
а обновление происходит по событиям уровня бизнес-логики.
2. Толстый клиент: Доступ и логика работы с бд осуществляется на клиенте, и
кеширование занимается клиент, тогда синхронизация осуществляется кешем
2-го уровня из перечисленных выше (oscache, TreeCache).

Возможны комбинации этих подходов... но в целом как-то так обычно
Re[5]: EJB и кэширование
От: aka50 Россия  
Дата: 18.12.06 11:06
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>А есть какие-то альтернативные методы решения данной проблемы ? Скажем , если не использовать какие-либо источники данных... Скажем, просто, массив данных, который доступен всем пользователям....и т.п. То есть какие-то глобальные данные , которые не относятся к какому-либо источнику...Просто накапливаются в процессе работы и используются совместно...


Тогда используйте один из распределенных кешей, например JBoss TreeCache
http://docs.jboss.org/jbcache/1.2.4/TreeCache/html/
http://labs.jboss.com/portal/jbosscache/docs
Re[5]: EJB и кэширование
От: LDimas Россия  
Дата: 18.12.06 11:10
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>А есть какие-то альтернативные методы решения данной проблемы ? Скажем , если не использовать какие-либо источники данных... Скажем, просто, массив данных, который доступен всем пользователям....и т.п. То есть какие-то глобальные данные , которые не относятся к какому-либо источнику...Просто накапливаются в процессе работы и используются совместно...


Вообще можно сделать обычный синглтон. Однако вам прийдется думать о том, что же делать когда таких данных станет очень много, или например, насколько они актуальны. Ведь в базе что-то может поменяться.
Re[4]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 11:17
Оценка:
Здравствуйте, aka50, Вы писали:

A>Возможны комбинации этих подходов... но в целом как-то так обычно

В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?

[modertor]Излишнее цитирование удалено. Blazkowicz[/modertor]
Re[5]: EJB и кэширование
От: aka50 Россия  
Дата: 18.12.06 11:24
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?


Это зависит от ejb контейнера, как это конфигурировать, но например в случае jboss, в качестве persistance используется hibernate,
а следовательно достаточно просто сконфигурировать кеш второго уровня (при чем любой, не обязательно распределенный), т.е.
ehcache вполне подойдет.

    <!-- Second-level caching -->
    <attribute name="SecondLevelCacheEnabled">true</attribute>
    <attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
    <attribute name="QueryCacheEnabled">true</attribute>


Ну и читать как настраивается это ehcache
http://ehcache.sourceforge.net/documentation/index.html
Re[6]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 11:25
Оценка:
Здравствуйте, LDimas, Вы писали:

LD>Здравствуйте, ALER_PROG, Вы писали:


ALE>>А есть какие-то альтернативные методы решения данной проблемы ? Скажем , если не использовать какие-либо источники данных... Скажем, просто, массив данных, который доступен всем пользователям....и т.п. То есть какие-то глобальные данные , которые не относятся к какому-либо источнику...Просто накапливаются в процессе работы и используются совместно...


LD>Вообще можно сделать обычный синглтон. Однако вам прийдется думать о том, что же делать когда таких данных станет очень много, или например, насколько они актуальны. Ведь в базе что-то может поменяться.

Вопрос в другом: КАК и ГДЕ этот объект будет жить ??? Ни один из видов EJB не подпадает под такие условия жизни.(BMP и CMP завязаны с источником данных, SFSB — доступен только в рамках сессии ОДНОГО клиента, SLSB — не предназначен вообще для хранения каких-либо данных) ??
Re[5]: EJB и кэширование
От: Michael_Y Украина  
Дата: 18.12.06 11:32
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?


Какая версия EJB (2 или 3)?
Может между Сервлет и EJB вставить прослойку, которая будет кэшировать данные?
Re[6]: EJB и кэширование
От: aka50 Россия  
Дата: 18.12.06 11:46
Оценка:
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, ALER_PROG, Вы писали:


ALE>>В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?


A>Ну и читать как настраивается это ehcache

A>http://ehcache.sourceforge.net/documentation/index.html

Увлекся ejb3 .

Тогда просто почитать про ehcache. Ибо он ни к чему не привязан,
но придется делать руками.

Можно подумать на счет облегчения себе жизни и использовать
iBatis. Работает с кешем замечательно, при этом поддерживает
сброс кеша по определенным командам или по времени...

В вашем случае инициализировать кеш придется самостоятельно...
Re[6]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 12:08
Оценка:
Здравствуйте, Michael_Y, Вы писали:

M_Y>Здравствуйте, ALER_PROG, Вы писали:


ALE>>В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?


M_Y> Какая версия EJB (2 или 3)?

M_Y> Может между Сервлет и EJB вставить прослойку, которая будет кэшировать данные?
EJB 2.0. А какую прослойку например ? Вообще, в качестве такого объекта кэширования я первоначально думал использовать сервлет, так как он не уничтожается сервером по окончанию выполнения работы, а время жизни можно устанвоить в настройках веб-сервера...Однако, в этом случае, получится ли передать указатель на эти данные в EJB ? ...думаю, можно попробовать...
Re: EJB и кэширование
От: C0s Россия  
Дата: 18.12.06 12:23
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>Такую проблему никак не могу решить...


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

ALE>как осуществить такое кэширование ? (планировал сделать это с помощью EJB, но , пока не нашёл решение данной проблемы...)


кэш — это обычные java-объекты в памяти JVM
самый простой вариант — какая-то структура данных, статически доступная из класса реализации SLSB, который предоставляет доступ к этим данным клиенту. по спеке иметь статические поля как бы нельзя, но только потому что неаккуратное обращение с ними приведет к проблемам. если же делать аккуратно, то все будет ok (главное не переборщить с размером кэша, все-таки для контейнера может оказаться неприятным открытием, что кто-то внтури него бесконтрольно отжирает память)
Re[7]: EJB и кэширование
От: Michael_Y Украина  
Дата: 18.12.06 12:34
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

ALE>>>В качестве клиента — тонкий клиент (обычный веб-браузер)... Как взаимодействуют : клиент — Сервлет — EJB — JDBC — MSSQLServer (собственно, 5-звенная структура, заложенная самой платформой). Изучая возможности EJB на первых порах, думал, что они способны осуществлять хранение данных как в источнике данных , так и в самом контейнере... Вот сейчас и пытаюсь решить такую проблему, поскольку EJB , я так понял, на такое не способны... или может я ошибаюсь ?


M_Y>> Какая версия EJB (2 или 3)?

M_Y>> Может между Сервлет и EJB вставить прослойку, которая будет кэшировать данные?
ALE>EJB 2.0. А какую прослойку например ? Вообще, в качестве такого объекта кэширования я первоначально думал использовать сервлет, так как он не уничтожается сервером по окончанию выполнения работы, а время жизни можно устанвоить в настройках веб-сервера...Однако, в этом случае, получится ли передать указатель на эти данные в EJB ? ...думаю, можно попробовать...

Как у вас происходит получение данных? Через Entity EJB?
Если EJB у вас — это Entity EJB, то можно прямо в EJB запихнуть логику работы с кэшем. Если нет, то надо писать свою прослойку — классы, через которые происходит получение/вставка/изменение данных и которые реализуют логику раоты с кэшем (проверяют наличие данных в кэше, если их нет, вытягивают из базы и прочее), т.е. DAO (если я правильно понимаю ).
Re[8]: EJB и кэширование
От: ALER_PROG  
Дата: 18.12.06 13:06
Оценка:
Здравствуйте, Michael_Y, Вы писали:

M_Y> Как у вас происходит получение данных? Через Entity EJB?

M_Y> Если EJB у вас — это Entity EJB, то можно прямо в EJB запихнуть логику работы с кэшем. Если нет, то надо писать свою прослойку — классы, через которые происходит получение/вставка/изменение данных и которые реализуют логику раоты с кэшем (проверяют наличие данных в кэше, если их нет, вытягивают из базы и прочее), т.е. DAO (если я правильно понимаю ).
возможно я не совсем понимаю... сам Entity EJB связан напрямую с источником данных. Под кэшированием в данном случае я понимаю некий объект, существующий в оперативной памяти (RAM) контейнера ПОСТОЯННО , или , покрайней мере, его существование может управляться.... Возникает вопрос: каким образом CMP или BMP может обеспечить существование такого объекта ?

[modertor]Излишнее цитирование удалено. Blazkowicz[/modertor]
Re[9]: EJB и кэширование
От: Michael_Y Украина  
Дата: 18.12.06 14:07
Оценка:
Здравствуйте, ALER_PROG, Вы писали:

M_Y>> Как у вас происходит получение данных? Через Entity EJB?

M_Y>> Если EJB у вас — это Entity EJB, то можно прямо в EJB запихнуть логику работы с кэшем. Если нет, то надо писать свою прослойку — классы, через которые происходит получение/вставка/изменение данных и которые реализуют логику раоты с кэшем (проверяют наличие данных в кэше, если их нет, вытягивают из базы и прочее), т.е. DAO (если я правильно понимаю ).
ALE>возможно я не совсем понимаю... сам Entity EJB связан напрямую с источником данных. Под кэшированием в данном случае я понимаю некий объект, существующий в оперативной памяти (RAM) контейнера ПОСТОЯННО , или , покрайней мере, его существование может управляться.... Возникает вопрос: каким образом CMP или BMP может обеспечить существование такого объекта ?

Может и я чего не понимаю, т.к. с Entity EJB практически не работал.

Введем определения:
DTO (Data Transfer Object) — содержит данные (из базы), в простейшем случае — класс из набора public полей.
DAO (Data Access Object) — реализация CRUD операций для DTO.

В твоем случае EJB выступает как смесь DTO и DAO (если я правильно понимаю).
Операции CRUD в Entity EJB реализуются методами ejbLoad, ejbStore, ejbRemove. Тебе достаточно будет добавить в
эти методы проверку наличия DTO (ассоциированного с данным экземпляром Entity EJB) в кэше. Ну и удалять/изменять его в кэше при удалении/изменении. Т.е. тебе надо выделить из твоих Entity EJB классы идентификаторов (primary key) и соственно DTO.

Если я где ошибся или неправильно понимаю работу Entity EJB, буду рад критике более опытных коллег .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.