iteye_5809 2009-09-01 09:46
浏览 244
已采纳

hibernate和mysql的缓存问题,没辙了!

    各位大侠好,我的hibernate出了很严重的问题,我用的数据库是mysql,大家请看下面这段代码,我每次已经把值正确插入到数据库后,下面的这个方法查询出来的还是旧数据,等页面刷新好几次后才查询出新的数据,有时候刷新一会是新的数据一会是旧的数据。

public double sumExpense(String userid,String itemid,String yearmonth){
        Session session = SessionBuilder.getSession();
        double sum = 0d;
        String hql = "SELECT SUM(c.expenditrue) FROM  Consumeaccount c WHERE c.usrplanrel.id.userbasicinfo.userid='"+userid+"'  AND c.accountitmecode.itemid='"+itemid+"' AND c.dat LIKE '"+yearmonth+"%'";
        Object obj = session.createQuery(hql).uniqueResult();
        if(obj!=null){
            sum = Double.parseDouble(obj.toString());
        }
        return sum;
    }

 上面的方法改为这个后就没问题,就是每次都重新创建新的session工厂

/**
     *根据消费分类ID、模板ID、年度月份查询该消费分类的实际消费值总和
     * @param itemid
     * @param templateid
     * @param yearmonth
     * @return
     */
    public double sumExpense(String userid,String itemid,String yearmonth){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();    
        Session session = sessionFactory.openSession();
        double sum = 0d;
        String hql = "SELECT SUM(c.expenditrue) FROM  Consumeaccount c WHERE c.usrplanrel.id.userbasicinfo.userid='"+userid+"'  AND c.accountitmecode.itemid='"+itemid+"' AND c.dat LIKE '"+yearmonth+"%'";
        Object obj = session.createQuery(hql).uniqueResult();
        if(obj!=null){
            sum = Double.parseDouble(obj.toString());
        }
        return sum;
    }

  请问这个是怎么回事呢,程序中好多处都是这个问题,我的二级缓存已经关了

 

  <property name="cache.use_query_cache">false</property>
    <property name="cache.use_second_level_cache">false</property>

 


问题补充:
我的SessionBuilder.getSession();应该没问题的,我曾经也用了hibernate自动生成的得到session的方法,目前用的这个Thread模式
public static SessionFactory sessionFactory;

static {

try {

sessionFactory = new Configuration().configure()

.buildSessionFactory();

} catch (Throwable ex) {

throw new ExceptionInInitializerError(ex);

}

}

public static final ThreadLocal session =

new ThreadLocal();

public static Session getSession() throws HibernateException {

Session s = (Session) session.get();

if(s == null) {

s = sessionFactory.openSession();

session.set(s);

}

return s;

}

public static void closeSession() throws HibernateException {

Session s = (Session) session.get();

if(s != null) {

s.close();

}

session.set(null);

}

问题补充:
首先感谢大家的回答,我的插入有事物,每次插入完成后都有flush,而且我自己在数据库里面修改一个字段刷新页面好几次才能得到新数据。至于什么数据库隔离级别我不太懂啊,但是应该和那没关系。
我自己的写的测试方法在类的main方法里面执行的时候,一直不会出现过期数据,很奇怪。
  • 写回答

6条回答 默认 最新

  • 君山玉 2009-09-01 22:23
    关注

    [code="java"]Session s = (Session) session.get();[/code]
    老大,ThreadLocal它是一种服务器端行为,当服务器每生成一个新的线程时,就会维护自己的ThreadLocal,一般的应用服务器都会维护一套线程池,也就是说,对于每次访问,并不一定就新生成一个线程。而是自己有一个线程缓存池。对于访问,先从缓存池里面找到已有的线程,如果已经用光,才去新生成新的线程,所以,由于开发人员自己在测试时,一般只有他自己在测,这样服务器的负担很小,这样导致每次访问可能是共用同样一个线程,这样也就导致了你有可能每次拿的都是同一个Session对象

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题