日期:2014-05-17  浏览次数:20709 次

Quartz中Hibernate数据库操作的怪问题
最近做了一个项目框架是Spring+Hibernate+Webwork,数据库是MySQL。用到了Quartz。这个job继承QuartzJobBean,直接使用DAO层。 

项目每10分钟运行一次,中间有个for循环,循环内部有个DAO的Update操作。 
结果发现有个很严重的问题,job正常运行一段时间后,Update操作多次后,某个循环中,程序运到Update操作就不动了,像假死一样。 

请求指点,谢谢。

JOB中的部分的代码

protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
  for (int i = 0; i < 1000; i++) {
  abcDAO.update("update table set a=1");
  }
}


DAO中的代码

public class AbcDAO extends HibernateDaoSupport {
  public void update(String hql) {
  Session session = null;
  try {
  session = (Session) getSession();
  if (session.isOpen()) {
  System.out.println("session is Open");
  }
  if (session.isConnected()) {
  System.out.println("session is Connected");
  }
  session.createQuery(hql).executeUpdate();
  } catch (Exception e) {
  logger.error("sql操作失败 : " + e.getMessage());
  } finally {
  releaseSession(session);
  }
  }
}

上面代码测试的过程中,在红色语句处假死的,但是假死之前session is Open和session is Connected。


请老师指点,谢谢。


------解决方案--------------------
饿。。。水平比较低
代码上真看不出来。。。
帮你顶下吧!

会不会是其他原因,比如数据库timeout了,或者数据库的数据量不是很大
mysql吗,如果数据量过大的话,你敢存,他还不一定敢收呢。。。
你说假死。。。什么错误信息都没有么?
就连log都没有么?
发上来看看杂
------解决方案--------------------
session.createQuery(hql).executeUpdate(); 
后面加上session.flush();试试
------解决方案--------------------
探讨
session.createQuery(hql).executeUpdate();
后面加上session.flush();试试

------解决方案--------------------
spring也是有他的事务的。。。
你再配置文件里面写了么?
------解决方案--------------------
代码上没看出来但是整个job中不能只使用一个session的,不知道你现在是不是一直使用一个session.
如果没做特殊处理应该不是.每次保存完清空下session试试.