最近做了一个项目框架是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。
请老师指点,谢谢。

解决方案 »

  1.   

    中间我尝试把update换成save也是一样,即:
    public void save(Object object) {
    try {
    getHibernateTemplate().save(object);
    } catch (Exception exception) {
    logger.error("保存对象发生错误. ", exception);
    }
    }
    保存前面若干个对象是没有问题的,不知道最后做了多少次,就出现了假死现象。
    放在tomcat上独立跑,也是如此。正常运行一段时间后,不仅仅这个job假死,连WEB都是假死的,似乎数据库连不上了一样。
      

  2.   

    饿水平比较低
    代码上真看不出来
    帮你顶下吧!会不会是其他原因,比如数据库timeout了,或者数据库的数据量不是很大
    mysql吗,如果数据量过大的话,你敢存,他还不一定敢收呢
    你说假死什么错误信息都没有么?
    就连log都没有么?
    发上来看看杂
      

  3.   

    session.createQuery(hql).executeUpdate(); 
    后面加上session.flush();试试
      

  4.   

    各位,没有使用使用事物,session操作都托管给spring了
      

  5.   

    spring也是有他的事务的
    你再配置文件里面写了么?
      

  6.   

    代码上没看出来但是整个job中不能只使用一个session的,不知道你现在是不是一直使用一个session.
    如果没做特殊处理应该不是.每次保存完清空下session试试.
      

  7.   

    当然不是一个session,采用数据库的PROCESSLIST也可以看得出来的。
    谢谢各位啊,问题依然没有解决呢。
      

  8.   

    没有合适的答案
    但是问题解决了
    tks
      

  9.   

    3年后的今天 我也碰到这个问题。。但。。答案 公布于世了。。 <prop key="hibernate.connection.release_mode">after_statement</prop>