Ich habe eine Java Spring-Anwendung mit einer Oracle DB und Hibernate. In meinem Controller rufe ich ein DAO an, um einige Daten abzurufen. Die DAO-Methode wird fortgesetzt, bis sie die return-Anweisung erreicht und dann nicht mehr zum Controller zurückkehrt. Es wird keine Ausnahme ausgelöst. Stattdessen läuft es ab. Es ist so etwas wie diesesJava Spring DAO hängt an Return-Anweisung
Controller:
@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;
}
Ausgang:
1
2
Soweit ich sagen kann, es wird von der DB Abrufen richtig, Es scheint also kein DB-Problem zu sein. Andere Datenbankaufrufe funktionieren einwandfrei.
Vom Debugger scheint es irgendwo innerhalb der Return-Anweisung hängen. Genauer gesagt, es scheint auf SocketInputStream.java gehängt werden, beim Versuch, socketRead0
zu rufen EDIT: Das Problem war mit Sortieren zu tun. Ich habe die untergeordneten Objekte des abgerufenen Objekts sortiert. Bei der Rückkehr versuchte Hibernate, zusätzliche Datenbankanrufe zu tätigen und als Ergebnis zu hängen. Ich habe das gelöst, indem ich das übergeordnete Objekt an die aufrufende Methode übergeben und dann in der aufrufenden Methode anstelle des DAO sortiert habe.
Da Sie sich in einer Transaktion befinden, könnten Sie in einen Deadlock oder eine andere Abfrage/Einfügung geraten, die auf Datenbankebene zu lange dauert. – JustinKSU
Ich stimme JustinKSU zu ... geht dein Commit durch? Brauchen Sie wirklich eine Transaktion für eine Leseoperation? –
Sieht so aus, als ob die Operationen in Ihrer getObjMap viel Zeit benötigen. Könnten Sie bitte auch diese Codezeilen teilen – PeaceIsPearl