У меня есть приложение 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.
Поскольку вы находитесь в транзакции, вы можете зайти в тупик или какой-либо другой запрос/вставку, которая слишком длится на уровне базы данных. – JustinKSU
Я согласен с JustinKSU ... твоя фиксация проходит? Вам действительно нужна транзакция для операции чтения? –
Похоже, что операции в вашем getObjMap занимают много времени. Не могли бы вы также поделиться этими строками кодов? – PeaceIsPearl