<!-----------------hibernate二级缓存ehcache------------------------->
hibernate配置
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
要缓存对象配置文件配置
<cache usage="read-only" region="sampleCache1"/>
针对一对多等关系时增加<cache usage="read-only"/>设置
<set name="items" cascade="all-delete-orphan" inverse="true" lazy="false" fetch="join">
<cache usage="read-only"/>
ehcache.xml配置
<!--
maxElementInMemory 表示该缓存中可以存放多少个对象
eternal 表示是否设置这些放入二级缓存的对象为永久的(即放入即保存,不再清除)一般都为false
timeToIdleSeconds 表示多少秒内,放入的对象没有被再次访问到,就清除掉
timeToLiveSeconds 表示对象在缓存中的存活时间,此属性是为了让更多的活跃对象进入到缓存
overflowToDisk 表示活跃对象超出最大值时,超出的对象是否要写入硬盘,用户缓解活跃用户较多的情况
-->
<cache name="sampleCache1"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="60"
timeToLiveSeconds="2000000"
overflowToDisk="false"
/>
hibernateTemplate下使用二级缓存
template.setCacheQueries(true);
//HibernateTemplate下的查询缓存
List<User> list = template.find("from User");
System.out.println("***testFind****"+list+" "+list.size()+" "+list.get(0));
//HibernateTemplate下的二级缓存
User user = (User)template.load(User.class, "01");
System.out.println(user);
template.setCacheQueries(false);
测试:
HibernateTemplate template = this.getHibernateTemplate();
template.setCacheQueries(true);
List<Order> list = template.find("from Order where id = ‘4028aabe4b486f83014b487030820001‘");
System.out.println("***testFind****"+list+" "+list.get(0).getItems());
Set set = list.get(0).getItems();
Item item = (Item)set.iterator().next();
System.out.println(item.getProductName()+" "+item.getOrder().getOrderName());
template.setCacheQueries(false);
/* template.setCacheQueries(true);
//HibernateTemplate下的查询缓存
List<User> list = template.find("from User");
System.out.println("***testFind****"+list+" "+list.size()+" "+list.get(0));
//HibernateTemplate下的二级缓存
User user = (User)template.load(User.class, "01");
System.out.println(user);
template.setCacheQueries(false);
*/
/**
* 查询缓存 ,第二次请求获取不同的数据库session
*/
/* Session session = this.getSessionFactory().openSession();
Query query = session.createQuery("select u.username from User u where u.userId = ‘01‘");
query.setCacheable(true);
List<Object[]> list = query.list();
System.out.println(list+" "+list.get(0));
session.close();
*/
/**
* 针对一对多关系只是把order缓存到二级缓存,其中的多方item没有进行缓存(在order配置文件里修改配置<cache usage="read-only"/>)
*/
/* Session session = this.getSessionFactory().openSession();
Transaction tran = session.beginTransaction();
Order order = (Order)session.load(Order.class,"4028aabe4b486f83014b487030820001");
System.out.println(order+" "+order.getId()+""+order.getItems());
tran.commit();
session.close();
*/
/**
* 同一个session,使用一级缓存,不同session(不同的请求获取数据库连接)使用二级缓存需要配置(针对单独对象不包含一对多等关系的)
*/
/* Session session = this.getSessionFactory().openSession();
Transaction tran = session.beginTransaction();
User user = (User)session.load(User.class,"01");
System.out.println(user+" "+user.getUsername());
// User user1 = (User)session.load(User.class,"01");
// System.out.println(user1+" "+user1.getUsername());
tran.commit();
session.close();
*/