Hibernate的Criteria查询Mysql数据奇怪的缓存
如题我是在Weblogic9用的是Hibernate3,struts2, 我已将二级缓存关闭:
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>
应用启动后,我手动修改数据库表数据后,Hibernate Criteria查询的结果没变;
SQL日志每次都能打出,我对org.hibernate.jdbc.AbstractBatcher做了跟踪,里面的跟踪代码打印也显示
查询确实执行了:
public ResultSet getResultSet(PreparedStatement ps) throws SQLException {
ResultSet rs = ps.executeQuery();
// 跟踪开始
int columnCount = rs.getMetaData().getColumnCount();
while(rs.next()){
for(int col = 1; col<=columnCount; col++){
System.out.println(">>>>RS("+col+"):"+rs.getMetaData().getColumnName(col)+"|"+rs.getString(col));
}
}
rs.beforeFirst();
// 跟踪结束
resultSetsToClose.add(rs);
logOpenResults();
return rs;
}
以上跟踪显示查询确实执行了,但是跟踪得到的查询结果依旧没有与数据库同步,而是老记录
有一些奇怪的现象:
如果我对Action类文件简单重编译一下再传上去,或者重启应用,则第一次能查出最新记录,但之后又不能实时查出最新修改后的记录;
以下为关键的方法代码:
/////////// 这是Service的实现的调用函数,其中CriteriaParas是我自定义的查询条件的封装
/**
* 得到菜单编号下的树结构
*/
public List<Menutree> getAllMenutreeByMenuno(String menuno){
List<Menutree> menutrees = null;
if (CommonUtil.isEmpty(menuno)) throw new LogicException("请提供菜单编号!");
CriteriaParas paras = new CriteriaParas();
paras.addCriterion(Restrictions.eq("id.menuno", menuno));
paras.setOrders(Order.asc("id.treeno"));
TransactionBegin(); // 使用JTA
menutrees = new EntityDAO().getCriteriaMenutreeList(paras);
TransactionCommit();
return menutrees;
}
//////////// 这是 EntityDAO 中的实现方法
// 条件查询
public List<Menutree> getCriteriaMenutreeList(CriteriaParas paras) {
List<Menutree> menutrees = null;
Session ss = HibernateUtil.getSession();
try {
ss.beginTransaction();
Criteria crit = ss.createCriteria(Menutree.class);
for (Iterator<Criterion> it = paras.getCriterionList().iterator(); it.hasNext();) {
crit.add(it.next());
}
crit.addOrder(paras.getOrders());
menutrees = crit.list();
ss.getTransaction().commit();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
ss.close();
}
return menutrees;
}