Ignite for 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 

这对我来说没什么意义。 我正在使用分支1.5.1-2中的Ignite 1.5.1.final-SNAPSHOT和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; } 

}

看起来EhCache区域工厂仍然使用,因此Ignite实际上并未配置为L2缓存。

您应该使用Ignite的HibernateRegionFactory ,请参阅HibernateL2CacheExample以获取正确配置的示例。