JDBC имеет этот механизм с именем запрос истек, вы можете вызвать метод setQueryTime объекта java.sql.Statement, чтобы включить этот параметр.
Hibernate не может сделать это унифицированным способом.
Если ваше приложение восстанавливает соединение JDBC vi java.sql.DataSource, вопрос может быть легко разрешен.
мы можем создать DateSourceWrapper для соединения с прокси-сервером, которые выполняют setQueryTimeout для каждого созданного ею оператора.
Пример кода легко читается, я использую некоторые классы весны, чтобы помочь этому.
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, чтобы обертка ваш существует DataSource для установки тайм-аута запроса для каждого заявления прозрачно!
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>
Вы используете пул соединений. – Bozho
Yup, используя C3PO – malaverdiere