Java Spring DAO挂起返回语句

时间:2016-05-16 15:02:33

标签: java spring hibernate return dao

我有一个带有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中进行排序来解决这个问题。

2 个答案:

答案 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)

只要看一下,数据库上就没有锁定说某些其他事务,这意味着如果在代码中使用了一些锁机制,那么就会看到它。

可能还有一些其他交易持有对表中记录的锁定。