JDBC имеет этот механизм с именем Query Timeout, вы можете вызвать метод setQueryTime объекта java.sql.Statement, чтобы включить этот параметр.
Hibernate не может сделать это унифицированно.
Если ваше приложение восстановит соединение JDBC vi java.sql.DataSource, вопрос может быть легко решен.
мы можем создать DateSourceWrapper для соединения с прокси, который выполняет setQueryTimeout для каждого созданного им оператора.
Пример кода легко читается, для этого я использую некоторые классы утилит Spring.
public class QueryTimeoutConfiguredDataSource extends DelegatingDataSource {
private int queryTimeout;
public QueryTimeoutConfiguredDataSource(DataSource dataSource) {
super(dataSource);
}
// override this method to proxy created connection
@Override
public Connection getConnection() throws SQLException {
return proxyWithQueryTimeout(super.getConnection());
}
// override this method to proxy created connection
@Override
public Connection getConnection(String username, String password) throws SQLException {
return proxyWithQueryTimeout(super.getConnection(username, password));
}
private Connection proxyWithQueryTimeout(final Connection connection) {
return proxy(connection, new InvocationHandler() {
//All the Statement instances are created here, we can do something
//If the return is instance of Statement object, we set query timeout to it
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = method.invoke(connection, args);
if (object instanceof Statement) {
((Statement) object).setQueryTimeout(queryTimeout);
}
return object;
});
}
private Connection proxy(Connection connection, InvocationHandler invocationHandler) {
return (Connection) Proxy.newProxyInstance(
connection.getClass().getClassLoader(),
ClassUtils.getAllInterfaces(connection),
invocationHandler);
}
public void setQueryTimeout(int queryTimeout) {
this.queryTimeout = queryTimeout;
}
}
Теперь мы можем использовать этот QueryTimeoutConfiguredDataSource, чтобы обернуть ваш существующий источник данных, чтобы прозрачно установить время ожидания запроса для каждого оператора!
Файл конфигурации Spring:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<bean class="com.stackoverflow.QueryTimeoutConfiguredDataSource">
<constructor-arg ref="dataSource"/>
<property name="queryTimeout" value="1" />
</bean>
</property>
</bean>