我看公司的DAO类里,几乎每个方法后面都有hibernateTemplate.clear();
为什么要clear清除缓存,缓存不是可以提升性能吗。

解决方案 »

  1.   

       
       session.clear()的运用,尤其在不断分页循环的时候,例如
    a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象
    b)另外一种形式的内存泄露  (语法级别没有 但是可由java引起)无论是load还是get,都会首先査找缓存(一级缓存),如果没有,才会去数据库査找,调用
    clear()方法可以强制清除session缓存。
      

  2.   

       比如,在同一个session里面分页(如果是不同的session,java虚拟机会自动清除),每次读100条,由于有session的引用,不会自动清除,到一定程度,内存会占战越多。如果是多用户,多线程,情况会更糟糕。(这种情况并不多见)。但是如果导数据的时候,就会发生这种情况,需要清除session。
       凭记忆和理解写的,如果有错,见谅。
      

  3.   

    LZ的问题——要从人与自然说起:   
        java对象在jvm中的生命周期——
    当应用程序通过new语句创建一个java对象时、jvm(java虚拟机)会为这个对象分配一块内存空间、只要这个对象被引用或者变量被引用,它就一直存在与内存中。如果这个对象不被任何引用变量引用,它就结束生命周期,此时jvm的垃圾回收器会在适当的时候回收它占用的内存。例子://创建一个List对象和两个Users对象,并定义3个引用变量list、user1、user2
    List list = new ArrayList();
    list.add("初始值");  //给一个初始值
    Users user1 = new Users();
    Users user2 = new Users("name2");user1.setName(list.get(0).toString());
    list.add(user1);//将引用变量全部设置为空
    user1 = null;  //第7行
    user2 = null;  //第8行
    list = null;   //第9行对于以上代码,第二个Users对象在第8行结束生命周期,第一个Users对象和List对象在第9行结束生命周期。第7行为什么没有结束第一个Users对象的生命周期呢?因为list.add(user1);引用了这个对象、然而List对象还没有结束生命周期所以第一个Users对象还“活”着。好了、下面就说说Session缓存了——
        如果希望一个java对象A一直处于生命周期中,就必须保证至少有一个变量引用它、或者可以从其他处生命周期中的对象B导航到这个对象A,比如在对象B的java集合属性中存放了对象A的引用。java集合(如Set、List和Map)的一个重要特性是:集合中存放的是java对象的引用。当向一个集合中添加一个对象时,其实是把这个对象的引用添加到集合中在Session接口的实现类中包含一系列的java集合,这些java集合构成了Session的缓存,只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期(没有结束生命周期就意味着一直占用内存)。
        当Session的save()方法持久化一个对象时,对象被加入到Session的缓存中,以后即使应用程序中的变量不再引用对象,只要Session的缓存还没有被清空,对象仍然处于生命周期中。
        当Session的get()方法试图从数据库中加载一个对象时。Session先判断缓存中是否已经存在这个对象,如果存在,就不需要在到数据库中检索,而直接从缓存中获得这个对象。
    Session缓存的作用:
        (1)、减少访问数据库的频率。应用程序从缓存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session缓存可以提高数据访问的性能。
        (2)、当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象的死循环,以及由死循环引起的jvm堆栈溢出异常。
        (3)、保证数据库中的相关记录与缓存中的相应对象保持同步。可能是你们访问数据库的频率比较低、或者其他原因吧!!!