各位大侠好,我的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方法里面执行的时候,一直不会出现过期数据,很奇怪。