Ignite для Hibernate L2 работает очень медленно

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

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

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

Для меня это не имеет особого смысла. Я использую Ignite 1.5.1.final-SNAPSHOT из ветки 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;
    }

}


person Bruno    schedule 30.12.2015    source источник
comment
В вашем результате профилирования кеш не используется, так как он ожидает в базе данных. Это имеет для вас смысл?   -  person Kayaman    schedule 30.12.2015
comment
Каково соотношение попаданий на Ignite по сравнению с другими поставщиками, с которыми у вас не возникает проблемы? Возможно ли, что настройки времени жизни / истечения срока действия / выселения отличаются?   -  person Dragan Bozanovic    schedule 30.12.2015
comment
Определить очень медленно   -  person Norbert van Nobelen    schedule 30.12.2015
comment
@Kayaman Профилировщик показывает информацию о том, что кеш не используется, но это так, если я выключу Hibernate L2 или вернусь в EhCache, система будет работать нормально.   -  person Bruno    schedule 30.12.2015
comment
@DraganBozanovic Коэффициент попадания такой же, как и раньше, с EhCache, ничего не изменилось.   -  person Bruno    schedule 30.12.2015
comment
@NorbertvanNobelen Переход в спящий режим занимает минуты, и я вижу, что с каждым выполнением время увеличивается.   -  person Bruno    schedule 30.12.2015


Ответы (1)


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

Вместо этого вы должны использовать HibernateRegionFactory от Ignite, см. HibernateL2CacheExample для примера правильной конфигурации.

person Valentin Kulichenko    schedule 31.12.2015
comment
Прошу прощения за ошибку, я ввел неправильное значение в текст, но в своем приложении я использую HibernateRegionFactory, но я увижу конфигурацию в HibernateL2CacheExample и проведу дополнительные тесты. - person Bruno; 05.01.2016
comment
Я проверил конфигурацию на примере, и все в порядке, в моем приложении HIbernate Ignite L2 очень медленный. У меня больше нет идей ... - person Bruno; 26.01.2016
comment
Я открыл заявку в Apache Ignite JIRA. Кажется, имеет смысл кто-то из сообщества исследовать эту проблему. @Bruno, если возможно, предоставьте ссылку на воспроизводимый пример или хотя бы некоторые части кода в тикете JIRA. Будет идеально, если вы поделитесь исходниками через GitHub или другой инструмент. - person dmagda; 28.01.2016
comment
@dmagda К сожалению, я могу показать только свою конфигурацию, система, с которой я работаю, является частной. Поместите ссылку на заявку, и я смогу предоставить дополнительную информацию, которая может им понадобиться. - person Bruno; 28.01.2016
comment
@Bruno Это билет в Ignite JIRA. Пожалуйста, уточняйте подробности здесь. - person dmagda; 30.01.2016