Re: Есть эксперты по hibernate?
От: RomikT Германия  
Дата: 28.12.11 13:41
Оценка: +1
Здравствуйте, OneZerOne, Вы писали:

OZO>На сколько я понимаю кэш второго уровня — не должны создаваться новые экземпляры G(ORM) класса до тех пор, пока объект в кэше и не изменялся.


Кэш второго уровня позволяет заполнить поля объекта без запроса к базе. Сами экземпляры при этом будут создаваться (разные сессии — разные экземпляры).
Возможно, если сделать entity read-only и сказать кэшу что он тоже read-only, получится уговорить hibernate шарить объекты между сессиями. Но я в этом сомневаюсь.
Есть эксперты по hibernate?
От: OneZerOne Россия  
Дата: 28.12.11 13:31
Оценка:
Доброго времени суток всем! Есть проблема (либо непонимание) hibernate.

Обрисую ситуацию:

Приложение Grails с накрученным UI на Vaadin.
Если развернуть, то это java и объекты клиентской сессии, создаваемые при подключении нового пользователя

Работа с данными через hibernate + ehcache

Включен кэш второго уровня. Имеем пару G(ORM) объектов:

class MyObject{
    def MyObjectType objectType
    ...

    static mapping = {
        objectType(lazy: false)
        cache true
    }
}


class MyObjectType {

    ...

    static mapping = {
        cache true
    }
}



На сколько я понимаю кэш второго уровня — не должны создаваться новые экземпляры G(ORM) класса до тех пор, пока объект в кэше и не изменялся.
У MyObjectType определены hashCode и equals.

Идем дальше. Работа в рамках одной сессии:
Получение списка объектов MyObject.
При каждом получении списка MyObject в памяти создаются новые экземпляры MyObjectType (проверено профайлером), хотя по логике должен браться существующий экземпляр из кэша.
Есть какое-нибудь объяснение?

Вроде как решается выставлением lazy=true, и вызовом MyObject.findById(..) в случае обращения
(хотя вроде это должен сделать ehcache при получении MyObject).
В этом случае объект читается из кэша и все хорошо,
но только в рамках одной сессии.


Как только второй пользователь открывается и выполняет тот же код — создаются новые экземпляры MyObjectType. То есть основная проблема в том, что Hibernate Cache работает в рамках одной пользовательской сессии, а хотелось бы, чтобы он работал в рамках виртуальной машины.

Настройки кэша:

DataSource.groovy
hibernate {
  cache.use_second_level_cache = true
  cache.use_query_cache = true
  cache.provider_class = 'org.hibernate.cache.EhCacheProvider'
}



ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd">

    <defaultCache maxElementsInMemory="100"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="3600"
           overflowToDisk="false"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU"/>
    <cache name="com.test.MyObjectType"
           maxElementsInMemory="10000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="3600"
           overflowToDisk="false"/>
</ehchache>



----
В целом у меня здесь должно быть 2 кэшируемых объекта.
Но вообще связка {некешируемый объект = {кэшируемый объект,...}} почему-то не очень работает. Кэшируемые объекты не должны плодиться, а они только этим и занимаются
Re: Есть эксперты по hibernate?
От: Blazkowicz Россия  
Дата: 28.12.11 13:38
Оценка:
Здравствуйте, OneZerOne:

1) Сущности и коллекции кэшируются отдельно.
2) Хибернейт ничего не знает про пользовательские сессии. Посмотрите как у вас создаётся Session и SessionFactory.
Re: Есть эксперты по hibernate?
От: StanislavK Великобритания  
Дата: 28.12.11 13:42
Оценка:
Здравствуйте, OneZerOne, Вы писали:

OZO>Доброго времени суток всем! Есть проблема (либо непонимание) hibernate.


OZO>При каждом получении списка MyObject в памяти создаются новые экземпляры MyObjectType (проверено профайлером), хотя по логике должен браться существующий экземпляр из кэша.

OZO>Есть какое-нибудь объяснение?

При работе в разных сессиях должен создаваться новый экземпляр объекта, иначе сессии уже не будут разными. Кеш он для того, чтобы в базу не лазить.
Re: Есть эксперты по hibernate?
От: Аноним  
Дата: 28.12.11 14:15
Оценка:
хтбернэйт кэширует не объекты, а кортежи значений, из которых потом когда требуется строит объекты.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.