Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Извлечение объектов Hibernate из памяти


Автор: Grelloo 25.4.2006, 14:29
Hibernate записывает объекты в базу данных. Остаются ли при этом эти объекты в памяти и если да, то можно ли их извлечь? То есть идея такая: зачем лезть в базу данных каждый раз, если можно брать объекты из памяти?
 

Автор: tux 25.4.2006, 14:41
Hibernate можно настроить на кэширование как объектов, так и запросов в целом. Почитай вот здесь - http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache. 

Автор: Grelloo 26.4.2006, 00:02
На http://www.hibernate.org/208.html нарыл ссылки об Using the Second-level Cache.
http://ehcache.sourceforge.net/documentation/getting_started.html
Описывается,  что надо для использования ehcache as a Hibernate plugin:

 Place ehcache and the ehcache-constructs jars in your classpath accessible to your web container.
Place ehcache.xml in your classpath.
Configure a cache for your web page in ehcache.xml.
Configure the web.xml

http://ehcache.sourceforge.net/documentation/hibernate.html
Описываются hibernate-маппинги и непросредственно сам ehcache.xml

Все это я сделал, теперь немного затрудняюсь в использовании cache.

В http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache описывается Using the Second-level Cache

Map cacheEntries = sessionFactory.getStatistics()
        .getSecondLevelCacheStatistics(regionName)
        .getEntries();

Если скажем мне надо было бы ввести объект в базу данных, то я просто бы создал instance сессии, записал бы объект и все. Как записать этот же объект в cache (немного затрудняюсь с кодом).
 

Автор: tux 26.4.2006, 01:52
Ээээ... А зачем тебе вообще какой-то код, мне не понятно? Описываешь в XML конфигурацию кэша, Hibernate тебе сам все кэширует и сам пытается сперва найти объекты в кэше, а затем уже выполняет запрос. Причем использует для хранения кэшируемых объектов ehcache. Может быть конечно что у ehcache есть открытый API работы с кэшем объектов, тогда в его javadoc и надо смотреть, только я, честно говоря, не вижу в этом смысла раз уж Hibernate все уже за тебя делает. 

Автор: Grelloo 26.4.2006, 07:31
То бишь я делаю следующие действия:
Place ehcache and the ehcache-constructs jars in your classpath accessible to your web container.
Place ehcache.xml in your classpath.
Configure a cache for your web page in ehcache.xml
Затем дописываю в маппинг класса (например User.hbm.xml) строчки типа 
Код

<cache usage="read-write"/>

И делать с объектами то же что и раньше, не используя Statistics  API и не прописывая ничего нового в hibernate.cfg.xml, а hibernate будет просто сам все кэшировать?

Я просто думаю, что надо импортировать org.hibernate.cache.EhCacheProvider и затем использовать Statistics  API для доступа к этому кэшу. 
 

Автор: tux 26.4.2006, 08:23
Если хочешь, можешь конечно использовать API, но придется тогда с этим API разбираться (причем не с Hibernate, а с EhCache). Обычно использовать напрямую не требуется, Hibernate сам со всем прекрасно справится. 

Автор: Grelloo 26.4.2006, 12:06
Я написал следующие маппинги: ehcache.xml и Message.hbm.xml (прикреплены). Положил ehcache and the ehcache-constructs jars в свой classpath. Запустил свое приложение и в логах получил следующее:

Switch second-level cache and set cache provider
Код

14:26:44,769  INFO SettingsFactory:209 - Second-level cache: enabled
14:26:44,769  INFO SettingsFactory:213 - Query cache: disabled
14:26:44,769  INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider
14:26:44,785  INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled
14:26:44,785  INFO SettingsFactory:237 - Structured second-level cache entries: disabled



Configuration
Код

14:26:44,910 DEBUG CacheManager:191 - Creating new CacheManager with default config
14:26:44,926 DEBUG CacheManager:164 - Configuring ehcache from classpath.
14:26:44,926 DEBUG Configurator:121 - Configuring ehcache from ehcache.xml found in the classpath: file:/D:/Documents%20and%20Settings/exadel1/Zhdanov/HiberSer4/build/web/WEB-INF/classes/ehcache.xml


Initialise and use
Код

14:26:44,973 DEBUG MemoryStore:147 - example.Message Cache: Using SpoolingLinkedHashMap implementation
14:26:44,973 DEBUG MemoryStore:128 - initialized MemoryStore for example.Message
14:26:44,973 DEBUG Cache:277 - Initialised cache: example.Message
14:26:50,425 DEBUG Cache:906 - example.Message: Is element with key example.Message#1 expired?: false


Если я все правильно понял, то hibernate использует EhCacheProvider для записи в кэш объект класса example.Message и потом достает его оттуда.

Теперь возникает следующий вопрос: если мне надо создать на котором будут постоянно добавляться новые сообщения, то мне не придется создавать свой connection pool, а можно будет использовать second-level cache? 
  

Автор: tux 26.4.2006, 12:28
Цитата(Grelloo @  26.4.2006,  17:06 Найти цитируемый пост)
Если я все правильно понял, то hibernate использует EhCacheProvider для записи в кэш объект класса example.Message и потом достает его оттуда.

Все правильно.

Цитата(Grelloo @  26.4.2006,  17:06 Найти цитируемый пост)
Теперь возникает следующий вопрос: если мне надо создать на котором будут постоянно добавляться новые сообщения, то мне не придется создавать свой connection pool, а можно будет использовать second-level cache? 

Не понял, а при чем здесь connection pool? Это совершенно разные вещи. Connection pool оптимизирует использование соединение с базой данных, вместо того, чтобы соединение закрывать перемещает его во временное хранилище чтобы потом его повторно использовать. И зачем создавать свой пул соединений? Hibernate и с этим прекрасно справляется сам, достаточно настроить. EhCache кэширует объекты в памяти/на диске чтобы без выполнения запросов можно было эти объекты получить. В production обычно нужно и то и другое. 

Автор: Grelloo 26.4.2006, 13:32
Хорошо, а как насчет выбора cache: хватит ли мне EhCacheProvider для создание средненького блога новостей или мне надо воспользоваться чем-нибудь помощней типа JBoss TreeCache? 

Автор: vepeter 26.4.2006, 14:25
Цитата(Grelloo @ 26.4.2006,  13:32)
хватит ли мне EhCacheProvider для создание средненького блога новостей или мне надо воспользоваться чем-нибудь помощней типа JBoss TreeCache?

EhCacheProvider вполне хватит. Преимуществом JBoss Cache является его транзакционность.  

Автор: Grelloo 26.4.2006, 14:51
Большое спасибо за помощь. Теперь буду настраивать EhCacheProvider 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)