javaweb-关于hibernate一级缓存问题

问题描述

关于hibernate一级缓存问题
    Team team = (Team) meaulInter.executeQueryById(Team.class, 1);
    System.out.println(team.getName());
    Team team2 = (Team) meaulInter.executeQueryById(Team.class, 1);
    System.out.println(team2.getName());

    这段代码中,meaulInter类里面有一个查询方法,其中在这里,查询出来的结构能够放入一级缓存(SQL语句只发出一次)

    但是

    List<Team> teams = meaulInter.executeQuery("from Team");
    System.out.println(teams);
List<Team> teams2 = meaulInter.executeQuery("from Team");
    System.out.println(teams2);

    其中meaulInter封装了一个查询全部的方法,返回的是 query.list(),
    为什么这样就不能放入一级缓存,SQL语句发出2次。

    其中executeQuery()方法代码如下:
    public List executeQuery(String hql, Object... prameters) {
    Query query = sessionFactory.getCurrentSession().createQuery(hql);
    if(prameters!=null&&prameters.length>0){
        for (int i = 0; i < prameters.length; i++) {
            query.setParameter(i, prameters[i]);
        }
    }
        return query.list();
}

求大神指点下,我查阅过资料,说 list 能放入一级缓存的,问什么现在不起效呢。

解决方案

Query query = sessionFactory.getCurrentSession().createQuery(hql);

时间: 2024-09-14 09:32:01

javaweb-关于hibernate一级缓存问题的相关文章

java模拟hibernate一级缓存示例分享_java

纯Java代码模拟Hibernate一级缓存原理,简单易懂. 复制代码 代码如下: import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; public class LevelOneCache { //这个对象就是用来模拟hibernate一级缓存的 private static Map<Integer, Student> stus=new HashMap&l

javaweb-关于hibernate一级缓存问题。

问题描述 关于hibernate一级缓存问题. hibernate的list查询会向一级缓存里面放入数据,但是下次取数据的时候,却不会再一级缓存里面取 ,怎样可以令到list查询到一级缓存里面取数据? 解决方案 所谓的下一次是在同一个Session中还是在不同的Session中, 在同一个Session中当然可以获取得到 在不同的Session中当然不能获取了(因为另一个Session已经关闭了)

hibernate一级缓存,二级缓存,三级缓存,缓存算法及配置。

什么是缓存(我的理解):在内存中开辟一块空间,把原来在硬盘上的东西,放到内存当中,当需要用到一些数据时,直接在内存中查找,而不是到硬盘上查找.这块内存中的空间就是缓存.缓存能提高程序的运行效率. 一级缓存(session级的缓存):在一个session中load同一个对象2次,load时,hibernate首先在session缓存中查找对象,如果没找到就到数据库中去load.因此,在同一个session中load一个对象2次,只会发出一条sql语句.而在2个session中load同一个对象则会

hibernate 一级缓存 和多线程操作是否无解?

问题描述 hibernate 每个线程都有自己的session, session里面都有自己的一级缓存,而且不能取消.这样的话,如果多线程对同一张表做操作. 会出现数据不一致的情况..比如 一个线程update了一条数据.另一个线程缓存的数据就不是最新数据.如果用load get之类的 方法 就会得到非最新数据.造成数据混乱.hibernate是不是不能提供这方面的保证.只有程序控制吗?大家碰到过这样的问题吗.一般都如何考虑的? 问题补充:xiaogui363 写道 解决方案 在查询前,手动关闭

hibernate session-hibernate中关于一级缓存的问题?

问题描述 hibernate中关于一级缓存的问题? 在hibernate中,查询是不需要开启缓存的,但是在get或load的时候,为什么有查询了缓存,这个缓存是查询缓存还是一级缓存? 解决方案 这里有详解:http://www.blogjava.net/tbwshc/articles/380013.html

hibernate 中的一级缓存 二级缓存

1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做"缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗.   缓存策略提供商: 提供了HashTable缓存,EHCache,OSCache,Swa

【hibernate框架】缓存机制之一级缓存

什么是缓存:我们在内存中开辟一块空间,把本来应该存储在硬盘上的东西,然后给它放在内存里,将来要读的时候从内存中读,这个部分就叫做缓存. 在hibernate有三种缓存,一级缓存,二级缓存和查询缓存. 一级缓存是session级别的缓存. 例子: @Test public void testHuanCun(){ Session session = sf.openSession(); session.beginTransaction(); Category c=(Category)session.l

Hibernate之一级缓存和二级缓存

1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据):  1.2:Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败: 1.3:一级缓存的特点,只在session范围有效,作用时间

hibernate中一级缓存和二级缓存

    一级与二级缓存的作用:一级缓存是Session级别的,也就是说在一个事务中才会启作用.比如在一个事务中同时查询同一个对象,则不会两次去数据库中查询. 而二级缓存是sessionFactory级别的,不同的事务之间是可以共享的,有些权限,当用户首次登陆后便将关联的权限放到二级缓存中,这样每次需要权限时就无需再查询数据库了. 最后再说明为什么这样设计:一般情况下,我们查询的数据一般是实时的,使用二级缓存肯定不行,使用一级缓存既利用了缓存又不会影响实时.  使用二级缓存是为了存储一些比较稳定的