2016-05-16 5 views
2

У меня есть приложение Java Spring с Oracle DB и Hibernate. В моем контроллере я вызываю DAO для получения некоторых данных. Метод DAO продолжается до тех пор, пока он не достигнет оператора return, а затем он не сможет вернуться к контроллеру. Никакое исключение не выбрасывается. Вместо этого время истекает. Это что-то вроде этогоJava Spring DAO зависает при возврате оператора

контроллер:

@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. В частности, он, кажется, висит на SocketInputStream.java при попытке вызвать socketRead0

EDIT: проблема связана с сортировкой. Я отсортировал дочерние объекты восстановленного объекта. По возвращении Hibernate пытался сделать дополнительные вызовы базы данных и повеситься в результате. Я решил это, передав родительский объект вызывающему методу, а затем отсортировав метод вызова вместо DAO.

+2

Поскольку вы находитесь в транзакции, вы можете зайти в тупик или какой-либо другой запрос/вставку, которая слишком длится на уровне базы данных. – JustinKSU

+0

Я согласен с JustinKSU ... твоя фиксация проходит? Вам действительно нужна транзакция для операции чтения? –

+0

Похоже, что операции в вашем getObjMap занимают много времени. Не могли бы вы также поделиться этими строками кодов? – PeaceIsPearl

ответ

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; 
} 
+0

Просто попробовал это. Не помогает - он висит в одном месте. Я не думаю, что это проблема с базой данных, потому что другие вызовы базы данных работают нормально. – DFL

+0

Пробовал ли вы отлаживать – PeaceIsPearl

+0

Да, он висит где-то внутри оператора возврата. – DFL

0

Просто посмотрите на него нет блокировки на базе данных от скажем какой-либо другой операции, то есть следить за тем, что если в коде используется механизм блокировки.

Возможно, существует какая-то другая транзакция с фиксацией записей в таблице.

+0

As насколько я могу судить, никаких проблем с базой данных нет. Я могу вызвать другие методы, которые просто обращаются к базе данных, даже те, которые используют одни и те же таблицы. – DFL

+0

Пожалуйста, проверьте это сообщение http://stackoverflow.com/questions/23753510/Тайм-аут от реализации из-JPA-транзакций, и с сессией недействительности – shankarsh15

 Смежные вопросы

  • Нет связанных вопросов^_^