您的位置:首页 > 其它

hibernate缓存机制

2014-03-09 22:59 190 查看
一级缓存(session缓存)

   1、生命周期就是session的生命周期

   2、一级缓存存放的数据都是私有数据

        把session存放在threadlocal中,不同的线程是不能访问的,所以保证了数据的安全性

   3、怎么样把数据存放到一级缓存中

        利用session.save/update/load/get方法都可以存放在一级缓存中

   4、利用session.get/load方法可以把数据从一级缓存中取出

   5、session.evict方法可以把一个对象从一级缓存中清空

   6、利用session.clear方法可以把session中的所有的数据清空

   7、利用session.Refresh方法把数据库中的数据同步到缓存中

   8、session.flush

        在session的缓存内部,会去检查所有的持久化对象

           1、如果一个持久化对象没有ID值,则会发出insert语句

           2、如果一个持久化对象有ID值,则会去检查快照进行对比,如果一样,则什么都不做,如果不一样,则发出update语句

           3、检查所有的持久化对象是否有关联对象

                检查关联对象的级联操作

                检查关联对象的关系操作

   9、批量操作

java代码示例

/**
* session.get方法把数据存放在一级缓存中
*/

/**
* session.load方法把数据存放在一级缓存中
*/

/**
* session.save方法把数据保存在一级缓存中
*/

/**
* session.update方法把数据保存在一级缓存中
*/
@Test
public void testUpdate(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
session.evict(classes);//classes对象从session中清空了
session.update(classes);//把classes对象放入到了session缓存中
classes = (Classes)session.get(Classes.class, 1L);
transaction.commit();
}

/**
* session.clear
*/
@Test
public void testClear(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
session.clear();//classes对象从session中清空了
classes = (Classes)session.get(Classes.class, 1L);
transaction.commit();
}

@Test
public void testClearTest(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
session.clear();//如果不加这句话,两个不同的对象,相同的ID值,所以得把其中的一个清空
Classes classes2 = new Classes();
classes2.setCid(1L);
classes2.setCname("asfd");
session.update(classes2);
transaction.commit();
}

/**
* 把数据库中的数据刷新到缓存中
*/
@Test
public void testRefresh(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
classes.setCname("66");
session.refresh(classes);//把cid为1的值从数据库刷到了缓存中
System.out.println(classes.getCname());
transaction.commit();
}

/**
* session.flush
*/
@Test
public void testFlush(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes =(Classes)session.get(Classes.class, 1L);
classes.setCname("afdsasdf");
Set<Student> students = classes.getStudents();
for(Student student:students){
student.setDescription("asdf");
}
session.flush();
transaction.commit();
}
/**
*向数据库中插入一百万条数据
*/
@Test
public void testSaveBatch(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
for(int i=6;i<1000000;i++){
Classes classes = new Classes();
classes.setCname("aaa");
classes.setDescription("afds");
session.save(classes);
//若不使用此判断则会产生内存溢出,
//因为session.save()操作会将对象持久化存在内存中
if(i%50==0){
session.flush();
session.clear();
}
}
transaction.commit();
}

/**
* session.flush只是发出SQL语句了,并没有清空session缓存
*/
@Test
public void testFlush2(){
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Classes classes = (Classes)session.get(Classes.class, 1L);
session.flush();
classes = (Classes)session.get(Classes.class, 1L);
transaction.commit();
}

二级缓存:
二级缓存:存放公有数据

   1、适用场合:

        1、数据不能频繁更新

        2、数据能公开,私密性不是很强

   2、hibernate本身并没有提供二级缓存的解决方案

   3、二级缓存的实现是依赖于第三方供应商完成的

         ehcache

         oscache

         jbosscache

         swamchache

   4、二级缓存的操作

         1、二级缓存存在sessionFactory中

         2、生命周期:与sessionFactory保持一致

      3、使用二级缓存的步骤
1、在hibernate.cfg.xml
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
2、让某一个对象进入到二级缓存中
* 在hibernate.cfg.xml中配置
<class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>
* 在映射文件中
<cache usage="read-only"/>
3、使用
session.get/session.load

查询缓存:

查询缓存是基于二级缓存的额,我们必须先将二级缓存配置好

在hibernate.cfg.xml中填入如下配置

<property name="cache.use_query_cache">true</property>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息