будьте в спящем режиме второй уровень ehcache мисс

Я пытаюсь добраться, второго уровня в спящем режиме работа кэша, с помощью ehcache реализации.

Я уверен, что это - некоторая очевидная ошибка новичка, которую я делаю, но я не вижу, каково это!

Для проверения моего кэша я делаю следующее:

Создание объекта и сохранение его. Я 'получаю' его однажды в рамках транзакции, где я вижу, что возвращаю объект без хита дб, который является просто быть в спящем режиме первого кэша уровня, делающего его вещь.

Затем я фиксирую транзакцию и запускаю новую сессию.

На этот раз, когда я 'получаю' объект, я вижу неудачное обращение в кэш от ehcache в отладках. Я ожидал бы объект быть в кэше теперь, так как я сохранил его в предыдущей транзакции?

Вот мой код:

  Session session = getSession();   
  session.beginTransaction();

  Test1 test1a = new Test1();
  test1a.setId(5);
  test1a.setName("Test 1");
  test1a.setValue(10);
  // Touch it
  session.save(test1a);

  // Now get it
  Test1 test1b = (Test1)session.get(Test1.class, 5);

  // Within a transaction, the session caches it - no db hit
  System.out.println("GOT object with value "+test1b.getValue());

  session.getTransaction().commit();

  System.out.println("Between sessions");

  session = getSession();
  session.beginTransaction();

  test1b = (Test1)session.get(Test1.class, 5);

  System.out.println("GOT object with value "+test1b.getValue());

  session.getTransaction().commit(); 

И вот соответствующая часть моего hibernate.cfg.xml

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

И мой ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd"> 
    <cache name="com.play.hibernate1.Test1" maxElementsInMemory="1000" eternal="false"     timeToLiveSeconds="600" overflowToDisk="false"/>
    <defaultCache maxElementsInMemory="10000" eternal="false"
overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="true" />
    </ehcache>

И мои аннотации

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Test1 {

И журналы отладки

11:21:03,474 DEBUG CacheManager:239 - Configuring ehcache from classpath.
11:21:03,479 DEBUG ConfigurationFactory:122 - Configuring ehcache from ehcache.xml found in the classpath: file:/Users/bw/Documents/workspace/hibernate1/target/classes/ehcache.xml
11:21:03,479 DEBUG ConfigurationFactory:87 - Configuring ehcache from URL: file:/Users/brucewood/Documents/workspace/hibernate1/target/classes/ehcache.xml
11:21:03,480 DEBUG ConfigurationFactory:139 - Configuring ehcache from InputStream
11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xmlns:xsi
11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xsi:noNamespaceSchemaLocation
11:21:03,517 DEBUG ConfigurationHelper:208 - No CacheManagerEventListenerFactory class specified. Skipping...
11:21:03,518 DEBUG ConfigurationHelper:183 - No CachePeerListenerFactoryConfiguration specified. Not configuring a CacheManagerPeerListener.
11:21:03,518 DEBUG ConfigurationHelper:159 - No CachePeerProviderFactoryConfiguration specified. Not configuring a CacheManagerPeerProvider.
11:21:03,525 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping...
11:21:03,526 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping...
11:21:03,532 DEBUG MemoryStore:73 - Initialized net.sf.ehcache.store.LruMemoryStore for com.play.hibernate1.Test1
11:21:03,533 DEBUG LruMemoryStore:71 - com.play.hibernate1.Test1 Cache: Using SpoolingLinkedHashMap implementation
11:21:03,533 DEBUG Cache:429 - Initialised cache: com.play.hibernate1.Test1
1528 [Finalizer] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost:3306/play
1668 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
GOT object with value 10
Hibernate: 
    /* insert com.play.hibernate1.Test1
        */ insert 
        into
            Test1
            (name, value, id) 
        values
            (?, ?, ?)
1274984463818|1|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5)
1274984463820|1|1|statement|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5)
1274984463821|1|1|commit||
Between sessions
11:21:03,823 DEBUG EhCache:68 - key: com.play.hibernate1.Test1#5
11:21:03,823 DEBUG MemoryStore:138 - com.play.hibernate1.Test1Cache: com.play.hibernate1.Test1MemoryStore miss for com.play.hibernate1.Test1#5
11:21:03,823 DEBUG Cache:661 - com.play.hibernate1.Test1 cache - Miss
11:21:03,824 DEBUG EhCache:77 - Element for com.play.hibernate1.Test1#5 is null
Hibernate: 
    /* load com.play.hibernate1.Test1 */ select
        test1x0_.id as id0_0_,
        test1x0_.name as name0_0_,
        test1x0_.value as value0_0_ 
    from
        Test1 test1x0_ 
    where
        test1x0_.id=?
1274984463829|4|1|statement|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=?|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5
1274984463831|-1||resultset|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5|name0_0_ = Test 1, value0_0_ = 10
GOT object with value 10
1274984463834|0|1|commit||

Спасибо за помощь!

6
задан J.Olufsen 21 May 2016 в 21:10
поделиться

1 ответ

Проблема заключалась в том, что я использовал NONSTRICT_READ_WRITE. Казалось, что это соответствовало закону из этого объяснения в документации:

Если приложение только время от времени необходимо обновить данные (т.е. если это крайне маловероятно, что два транзакции попытаются обновить один и тот же предмет одновременно), и строгий изоляция транзакции не требуется, кэш нестрого чтения-записи может быть подходящее. Если кеш используется в Среда JTA, необходимо указать hibernate.transaction.manager_lookup_class. В других средах вам следует убедиться, что транзакция завершено, когда Session.close () или Вызывается Session.disconnect ().

но на самом деле похоже, что он не добавляет сохраненные объекты в кеш .. Документы здесь немного тонкие, IMO. В Java Persistence с Hibernate есть лучшая обработка параметров кэширования, хотя все еще немного не хватает конкретного объяснения того, что на самом деле происходит с вашими данными. В любом случае ..

Я изменил свой параметр кеширования на READ_WRITE, и теперь он работает, как ожидалось.

Обратите внимание, что при первом добавлении объекта в кеш вы получаете «промах кеша» при отладке ehcache. Предположительно, он просматривает свой кеш, обнаруживает, что объекта там нет, регистрирует промах, а затем добавляет объект. После этого получаются «хиты».

7
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: