我有一个带有Oracle DB和Hibernate的Java Spring应用程序。在我的控制器中,我调用DAO来检索一些数据。 DAO方法继续进行,直到它到达return语句,然后它无法返回到控制器。没有异常被抛出。相反,它超时了。它是这样的
控制器:
@Autowired
DAO dao;
public @ResponseBody int controller(){
//stuff
System.out.println(1);
Map<Long, DBObj> objs = dao.getObjMap(ids);
System.out.println(3);
//other stuff
}
DAO:
@Transactional
public Map<Long, DBObj> getObjMap(List<Long> ids){
//stuff
System.out.println(2)
return objs;
}
输出:
1
2
据我所知,它正在从数据库中正确检索,因此它似乎不是数据库问题。其他数据库调用工作正常。
从调试器中,它似乎挂在return语句中的某个地方。具体来说,它在尝试调用socketRead0
时似乎挂在SocketInputStream.java上编辑:问题与排序有关。我对检索到的对象的子对象进行了排序。返回时,Hibernate试图进行额外的数据库调用并因此挂起。我通过将父对象传递给调用方法然后在调用方法而不是DAO中进行排序来解决这个问题。
答案 0 :(得分:0)
试试这个:
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Transactional(
timeout = 3600,
rollbackFor = { RuntimeException.class, ApplicationCheckedException.class },
noRollbackFor = { ApplicationCheckedNoRollbackException.class, InternalNoRollbackException.class })
public @interface LongTx {
// Empty.
}
使用@LongTx
注释您的方法@LongTx
public Map<Long, DBObj> getObjMap(List<Long> ids){
//stuff
System.out.println(2)
return objs;
}
答案 1 :(得分:0)
只要看一下,数据库上就没有锁定说某些其他事务,这意味着如果在代码中使用了一些锁机制,那么就会看到它。
可能还有一些其他交易持有对表中记录的锁定。