JDBC tiene este mecanismo llamado Tiempo de espera de consulta, puede llamar al método de objeto setQueryTime java.sql.Statement habilitar esta configuración.
Hibernate no puede hacer esto de forma unificada.
Si su aplicación recupera la conexión JDBC vi java.sql.DataSource, la pregunta se puede resolver fácilmente.
podemos crear un DateSourceWrapper para proxy Connnection que establece setQueryTimeout para cada instrucción que crea.
El código de ejemplo es fácil de leer, utilizo algunas clases de Spring Spring para ayudarlo.
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;
}
}
Ahora podemos utilizar este QueryTimeoutConfiguredDataSource a su envoltorio existe fuente de datos para establecer espera de consulta para cada declaración transparente! archivo de configuración
primavera:
<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>
¿Está utilizando un grupo de conexión. – Bozho
Sí, usando C3PO – malaverdiere