2015-12-30 2 views
2

У меня есть система с Hibernate, Spring, PostgreSQL, MongoDB, Neo4j и ElasticSearch, работающая с EhCache для Hibernate L2 и Spring Cache, она работает хорошо.Ignite for Hibernate L2 чрезвычайно медленный

Я тестирую Ignite, но система стала очень медленной, когда я запустил Ignite для Hibernate L2 (с быстрым загрузчиком Spring), я поставил JProfiler, чтобы увидеть, что действительно медленное, и я просто видел следующие методы очень медленными:

org.postgresql.core.VisibleBufferedInputStream.read(byte[ ], int, int) 
org.postgresql.jdbc2.AbstractJdbc2Statement.parseSql 
javax.persistence.EntityManager.find 

Это не имеет для меня никакого смысла. Я использую Ignite 1.5.1.final-SNAPSHOT из Branch 1.5.1-2 с https://github.com/apache/ignite/pull/388 (я сделал изменения, чтобы автоматически создавать кеши для Hibernate L2), я тестировал с 1.4.0, и проблема такая же.

Конфигурация для Ignite:

@Configuration 
public class CacheConfiguration { 

    @Bean 
    public DynamicClassLoaderWrapper dynamicClassLoaderWrapper() { 
     return new DynamicClassLoaderWrapper(this.getClass().getClassLoader()); 
    } 

    @Bean 
    @SuppressWarnings("unchecked") 
    public CacheManager cacheManager() { 
     IgniteConfiguration igniteConfiguration = new IgniteConfiguration(); 
     igniteConfiguration.setGridName("meceap-grid"); 
     igniteConfiguration.setClassLoader(dynamicClassLoaderWrapper()); 

     igniteConfiguration.setCacheConfiguration(this.createDefaultCache("br.com.bruno.model.*"), 
       this.createDefaultCache("org.hibernate.cache.spi.UpdateTimestampsCache"), 
       this.createDefaultCache("org.hibernate.cache.internal.StandardQueryCache")); 

     SpringCacheManager springCacheManager = new SpringCacheManager(); 
     springCacheManager.setConfiguration(igniteConfiguration); 
     springCacheManager.setDynamicCacheConfiguration(this.createDefaultCache(null)); 
     return springCacheManager; 
    } 

    private org.apache.ignite.configuration.CacheConfiguration createDefaultCache(String name) { 
     org.apache.ignite.configuration.CacheConfiguration cacheConfiguration = new org.apache.ignite.configuration.CacheConfiguration(); 
     cacheConfiguration.setName(name); 
     cacheConfiguration.setCacheMode(CacheMode.PARTITIONED); 
     cacheConfiguration.setAtomicityMode(CacheAtomicityMode.ATOMIC); 
     cacheConfiguration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); 
     cacheConfiguration.setStatisticsEnabled(true); 
     cacheConfiguration.setEvictSynchronized(true); 
     return cacheConfiguration; 
    } 

}

public class RepositoryConfiguration { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean meceapEntityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean(); 
     bean.setPersistenceUnitName(PERSISTENCE_UNIT_NAME); 
     bean.setDataSource(dataSource); 

     bean.getJpaPropertyMap().put("hibernate.dialect", hibernateDialect); 
     bean.getJpaPropertyMap().put("hibernate.ejb.naming_strategy", NamingStrategyLowerCase.class.getCanonicalName()); 
     bean.getJpaPropertyMap().put("hibernate.jdbc.batch_size", 0); 
     bean.getJpaPropertyMap().put("hibernate.use_sql_comments", true); 
     bean.getJpaPropertyMap().put("hibernate.show_sql", false); 
     bean.getJpaPropertyMap().put("org.apache.ignite.hibernate.grid_name", "meceap-grid"); 
     bean.getJpaPropertyMap().put("hibernate.cache.region.factory_class", HibernateRegionFactory.class.getCanonicalName()); 
     bean.getJpaPropertyMap().put("hibernate.cache.use_second_level_cache", true); 
     bean.getJpaPropertyMap().put("hibernate.cache.use_query_cache", true); 
     bean.getJpaPropertyMap().put("javax.persistence.sharedCache.mode", SharedCacheMode.ALL); 
     bean.getJpaPropertyMap().put("hibernate.cache.default_cache_concurrency_strategy", "read-write"); 
     bean.getJpaPropertyMap().put("hibernate.generate_statistics", true); 
     bean.getJpaPropertyMap().put("javax.persistence.validation.factory", validator); 

     bean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     bean.setPackagesToScan("br.com.me.ceap.model"); 

     meceapEntityManagerFactoryRef = bean; 

     return bean; 
    } 

}

+0

В результате профилирования кеш не используется, так как он ожидает в базе данных. Это имеет смысл для вас? – Kayaman

+0

Что такое коэффициент ударов по Ignite по сравнению с другими провайдерами, с которыми вы не сталкивались с проблемой? Возможно ли, что настройки времени жизни/истечения/выселения различны? –

+0

Определить «Чрезвычайно медленный» –

ответ

2

Похоже Ehcache области завод по-прежнему используется, поэтому Ignite не на самом деле настроен в качестве кэш-памяти L2.

Вместо этого следует использовать Ignite's HibernateRegionFactory, см., Например, правильную конфигурацию, например, HibernateL2CacheExample.

+0

Прошу прощения за ошибку, я поместил неправильное значение в текст, но в моем приложении я использую 'HibernateRegionFactory', но я увижу конфигурацию в HibernateL2CacheExample и сделаю больше тестов. – Bruno

+0

Я проверил конфигурацию в примере, и все в порядке, в моем приложении HIbernate Ignite L2 работает очень медленно. У меня больше нет идей ... – Bruno

+0

Я открыл билет в Apache Ignite JIRA. Кажется, что кто-то из сообщества имеет смысл исследовать эту проблему. @Bruno, если возможно, укажите ссылку на воспроизводимый пример или, по крайней мере, некоторые части кода в билет JIRA. Это будет идеально, если вы будете делиться источниками через GitHub или какой-либо другой инструмент. – dmagda

Смежные вопросы