我正在使用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;
}
});
}