我会给出一个详细的“Spring 整合 Hibernate 时启用二级缓存实例详解”的攻略。在这个攻略中,我会从以下几个方面来进行阐述:
- 为什么在整合 Spring 和 Hibernate 时需要使用二级缓存?
- 什么是二级缓存?Spring 如何支持 Hibernate 的二级缓存?
- 如何在Spring 和Hibernate 中启用二级缓存?
- 通过两个示例来说明如何在Spring 和 Hibernate 中使用二级缓存。
为什么在整合 Spring 和 Hibernate 时需要使用二级缓存?
在使用 Hibernate 进行数据访问过程中,由于数据访问是通过 SQL 语句执行的,因此当频繁的进行数据库访问时会带来较大的性能开销,从而导致系统处理缓慢。通过启用 Hibernate 的二级缓存,可以将 Hibernate 对象缓存在内存中,减少了对数据库的频繁访问,这样可以显著的提高系统的性能响应速度,提高系统的吞吐量。
什么是二级缓存?Spring 如何支持 Hibernate 的二级缓存?
为了解释什么是Hibernate的二级缓存,我们需要先介绍Hibernate的一级缓存。Hibernate中的一级缓存是Session级别的缓存,如果一个对象在一个Session中被加载了一次,那么在同一个Session中就只会从缓存中获取该对象,而不会再次访问数据库。在Hibernate中,只有唯一的一个SessionFactory,每个Session工厂都相当于一个独立的Hibernate运行环境。这意味着不同的Session实例之间不能共享数据,也就是说,Session之间的对象缓存也是独立的。
相对应的, Hibernate 的二级缓存则是SessionFactory级别的缓存,它可以存储位于不同Session中的相同对象。当需要访问一个对象时,如果它已经在缓存中,那么就不需要访问数据库从而提高性能。Hibernate 通过支持第三方缓存库实现了二级缓存功能,比如 EhCache。
Spring对Hibernate的缓存支持是通过Spring和Hibernate的集成来实现的,它不仅支持Hibernate的并发缓存,还支持Hibernate的二级缓存。
如何在Spring 和 Hibernate 中启用二级缓存?
要启用 Hibernate 的二级缓存,我们需要采用以下几个步骤。
1. 在Hibernate配置文件中设置二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
2. 配置缓存区域和策略。
在hibernate.cfg.xml文件中配置缓存策略和缓存区域,Hibernate通过支持第三方缓存库来实现,我们将使用Ehcache作为缓存策略,这个缓存策略必须在配置文件中通过factory_class属性来加载。类型属性必须是ehcache。每个缓存区域都必须指定一个唯一的名称和缓存策略。
<property name="hibernate.cache.region_prefix">sample-app</property>
<property name="hibernate.cache.region.journal.factory">org.jboss.cache.pojo.jms.JMSCacheLoaderFactory</property>
<cache name="sample-app-cache" />
<cache name="com.dashboarding.common.domain.CodeLookup.types"
timeout="1800"
maxEntriesLocalHeap="8000"
overflowToDisk="false"
/>
3. 在Hibernate实体类中添加缓存注解
@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”sample-app-cache”)
public class User(){
//……
}
4. 配置Spring对Hibernate的二级缓存支持
<bean class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>com/dashboarding/dao/hbm/workflow/Workflow.hbm.xml</value>
<value>com/dashboarding/dao/hbm/workflow/Task.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
</props>
</property>
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache"/>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true"/>
</bean>
示例1: Hibernate + Ehcache
下面我们通过一个示例来说明如何在Hibernate中使用Ehcache。
步骤1: 启用二级缓存
我们需要在 hibernate.cfg.xml 的属性中将 use_second_level_cache 设置为 true,将 region.factory_class 设置为 EhCacheRegionFactory。
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
步骤2: 配置缓存区域和策略
每个缓存区域都必须指定一个唯一的名称和缓存策略。
<!-- Ehcache configuration -->
<cache name="com.sample.app.Employee" maxElementsInMemory="100"
eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" />
<cache name="com.sample.app.Department" maxElementsInMemory="100"
eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" />
步骤3: 在实体类上加上缓存注解
在实体类上添加 Hibernate 的缓存注解
@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”com.sample.app.Employee”)
public class Employee{
//……
}
步骤4: 读取缓存中的数据
SessionFactory sessionFactory;
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", id));
criteria.setCacheable(true);
List<Employee> employees = criteria.list();
tx.commit();
session.close();
示例2: Spring + Hibernate + Ehcache
下面我们通过一个示例来说明如何在Spring和Hibernate中使用Ehcache。
步骤1: 配置Spring对Hibernate的二级缓存支持
配置Spring对Hibernate的二级缓存支持,在Spring配置文件中添加以下内容。
<bean class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
……
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache"/>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true"/>
</bean>
步骤2: 启用二级缓存
配置文件中开启二级缓存。
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
步骤3: 配置Session工厂中的二级缓存
在 Session 工厂中配置 Ehcache 缓存。
<property name="hibernateProperties">
……
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
</property>
步骤4: 在实体类上加上缓存注解
在实体类上添加 Hibernate 的缓存注解
@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”com.sample.app.Employee”)
public class Employee{
//……
}
步骤5: 读取缓存中的数据
@Autowired
SessionFactory sessionFactory;
public Employee getEmployeeById(int empId) {
Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", empId));
criteria.setCacheable(true);
Employee emp = (Employee)criteria.uniqueResult();
return emp;
}
在Spring和Hibernate中启动二级缓存非常简单。只需要简单的配置Spring和Hibernate,就可以提高系统在数据库查询方面的性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 整合 Hibernate 时启用二级缓存实例详解 - Python技术站