Hibernate错误 - Query.setTimeout无法按预期工作

时间:2018-03-20 11:57:28

标签: java sql-server spring hibernate

我正在使用Hibernate 3.6。

我称这种方法,但似乎没有效果 org.hibernate.Query.setTimeout

所以...我正在创建一个Query对象并使用它来调用MS SQL Server存储过程。

在程序中,我故意添加WAITFOR DELAY '00:00:20';以延迟执行。因此,该过程需要> = 20秒才能运行,这是肯定的。

我在休眠Query中设置了超时5秒。

另见: https://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/Query.html#setTimeout(int)

令我惊讶的是,经过5秒后,我的Java代码没有出错! Java代码只是在那里阻塞并等待存储过程完成?!?!?!

为什么会这样? 看起来对我来说是一个明显的错误。

我错过了什么?

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.NullableType;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.*;

..... other imports ..... 

..... other code ..... 

public Boolean callStoredProcedureWithArguments2(final String spName, final Integer timeout, final Object... arguments) {
    return (Boolean) getHibernateTemplate().execute(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            boolean success = false;
            try {
                StringBuilder sbQuery = new StringBuilder();
                sbQuery.append("EXEC " + spName + " ");
                int n = arguments == null ? 0 : arguments.length;
                for (int i = 0; i < n; i++) {
                    if (i > 0) {
                        sbQuery.append(",");
                    }
                    sbQuery.append(String.format(" :%s%d", "param", i));
                }
                Query query = session.createSQLQuery(sbQuery.toString());
                for (int i = 0; i < n; i++) {
                    if (arguments[i] == null) {
                        query.setParameter(String.format("%s%d", "param", i), arguments[i]);
                    } else {
                        AbstractSingleColumnStandardBasicType tp = HibernateUtil.getHibernateType(arguments[i].getClass());
                        if (tp == null) {
                            query.setParameter(String.format("%s%d", "param", i), arguments[i]);
                        } else {
                            query.setParameter(String.format("%s%d", "param", i), arguments[i], tp);
                        }
                    }
                }
                if (timeout != null){
                    query.setTimeout(timeout);
                }
                query.executeUpdate();
                success = true;
            } catch (Exception ex) {
                Logging.logError("Error while calling SP: " + spName + ".", ex);
                success = false;
            }
            return success;
        }
    });
}

0 个答案:

没有答案