问题
I have system with Hibernate, Spring, PostgreSQL, MongoDB, Neo4j and ElasticSearch working with EhCache for Hibernate L2 and Spring Cache, it works well.
I'm testing Ignite but the system became extremely slow when I put Ignite for Hibernate L2 (with Spring Cache works fast), I put JProfiler to see what is really slow and I just saw the follow methods extremely slow:
org.postgresql.core.VisibleBufferedInputStream.read(byte[ ], int, int)
org.postgresql.jdbc2.AbstractJdbc2Statement.parseSql
javax.persistence.EntityManager.find
This doesn't make much sense to me. I'm using Ignite 1.5.1.final-SNAPSHOT from Branch 1.5.1-2 with https://github.com/apache/ignite/pull/388 (I made a change to automatically create the caches for Hibernate L2), I tested with 1.4.0 and the problem is the same.
Configuration for 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;
}
}
回答1:
It looks like EhCache region factory is still used, so Ignite is not actually configured as the L2 cache.
You should use Ignite's HibernateRegionFactory
instead, refer to HibernateL2CacheExample
for example of correct configuration.
来源:https://stackoverflow.com/questions/34534251/ignite-for-hibernate-l2-is-extremely-slow