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条)

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序