Hibernate的Criteria查询Mysql数据奇怪的缓存

taxmma 2009-07-29 11:55:13
如题我是在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;
}

...全文
297 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyugendn 2012-04-01
  • 打赏
  • 举报
回复
答案在哪啊
guo882314 2011-11-17
  • 打赏
  • 举报
回复
我艹,确实如楼主所说,这个问题困扰我很长时间啊,谢谢楼主!
victorkevin 2010-05-27
  • 打赏
  • 举报
回复
你把mysql默认的事务隔离级别设置成read committed 就可以了。
liliang0504 2009-10-23
  • 打赏
  • 举报
回复
呵呵,果然如此,我也碰到这个问题!谢谢楼主!
taxmma 2009-07-29
  • 打赏
  • 举报
回复
本人一共就10分,别嫌弃分数少呀
taxmma 2009-07-29
  • 打赏
  • 举报
回复
问题解决了:

因为用了Hibernate默认的连接池;默认的连接池真的很有问题

配置文件里增加:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.min_size">5</property><!--在连接池中可用数据库连接的最小数目-->
<property name="c3p0.max_size">30</property><!--在连接池中所有数据库连接的最大数目-->
<property name="c3p0.time_out">1800</property><!--设定数据库连接的超时时间-->
<property name="c3p0.max_statement">50</property><!--可以被缓存的PreparedStatement的最大数目-->

就可以了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧