我为长时间运行的存储过程调用创建了一个异步服务。事情工作正常,但是在事务注释的超时属性中给出的指定值之后,事务没有超时。下面给出了代码的结构(不是真正的...只是骨架...忽略语义/语法)
//asynchronous service
@override
@async("myCustomTaskExecutor")
@Transactional(rollbackfor=Exception.class,timeout=600)
public void serviceMethod(){
//repository method is invoked.
repository.callStoredProcedure();
}
//Repository method in the Repository class
@Transactional(rollbackfor=Exception.class,timeout=600)
public void callStoredProcedure(){
//Stored procedure is called from the private method using hibernate doWork implementation.
privateCallmethod();
}
private void privateCallmethod() throws ApplicationException{
Session session = null;
try{
session = entityManager.unwrap(Session.class);
session.doWork(new Work(){
@Override
public void execute(Connection connection) throws SQLException {
OracleCallableStatement statement =null;
try{
//using hibernate 4.x and ref cursors are used...so went on with this approach..
//suggest if there is some better approach.
String sqlString =“{begin storProcName(?,?)}”;
statement = connection.prepareCall(sqlString);
statement.setInt(1,5);
statement.setString(2,“userName5”);
statement.executeUpdate();
}
catch(Exception e){
throw RunTimeException(e.getMessage);
}
finally{
if(statement != null)
statement.close();
}
}
}
});
}
catch(Exception e){
throw ApplicationException(e.getMessage);
}
//Not using Final block to close the session.Is it an issue ?
}
延迟发生在存储过程端(Thread.sleep(700)
未使用)但事务未超时......
问题:
@Transactional
就足够了解服务方法......对使用@Transactional
注释的正确方法有所了解
用于此代码设置。@Transactional
是否适用于doWork
接口实现中的JDBC调用...问题是什么?oracle.jdbc.readTimeout
中使用setQueryTimeout
或CallableStatement
......是否是实现此目的的正确方法。答案 0 :(得分:0)
如果@Transactional
Annotated方法不是该类的入口点,除非您启用加载时间编织(Spring默认为编译时编织)https://stackoverflow.com/a/17698587/6785908
你应该从这个类之外调用callStoredProcedure()
,然后它将是事务性的。如果您调用serviceMethod()
,而callStoredProcedure()
又会调用$AD_Account_To_Copy
,那么它将不会是事务性的
答案 1 :(得分:0)
我使用setQueryTimeout()方法来解决问题,因为@Transactional超时不能与hibernate dowork()方法一起使用...我猜它是由于hibernate工作在不同的线程中执行而且它是低级JDBC方法来调用商店程序......
注意:此特定应用程序使用非常弹簧3.x版本和hibernate 4.x与JPA 2.0规范...很少过时的版本