2016-05-16 5 views
2

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.

+2

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

+0

Ich stimme JustinKSU zu ... geht dein Commit durch? Brauchen Sie wirklich eine Transaktion für eine Leseoperation? –

+0

Sieht so aus, als ob die Operationen in Ihrer getObjMap viel Zeit benötigen. Könnten Sie bitte auch diese Codezeilen teilen – PeaceIsPearl

Antwort

0

Versuchen Sie folgendes:

@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. 

} 

Beschriften Sie Ihre Methode mit @LongTx

@LongTx 
public Map<Long, DBObj> getObjMap(List<Long> ids){ 
     //stuff 
     System.out.println(2) 
     return objs; 
} 
+0

Habe das gerade versucht. Es hilft nicht - es hängt an der gleichen Stelle. Ich denke nicht, dass es sich um ein Datenbankproblem handelt, da andere Datenbankaufrufe gut funktionieren. – DFL

+0

Haben Sie versucht, zu debuggen – PeaceIsPearl

+0

Ja, es hängt irgendwo in der Return-Anweisung. – DFL

0

Nur um es zu sehen gibt es keine Sperre für die Datenbank von etwa einer anderen Transaktion, sorgen dafür, was bedeutet, dass, wenn Es gibt einen Sperrmechanismus, der im Code verwendet wird.

Möglicherweise gibt es eine andere Transaktion, die eine Sperre für die Datensätze in der Tabelle enthält.

+0

As Soweit ich das beurteilen kann, gibt es kein Problem mit der Datenbank.Ich kann andere Methoden aufrufen, die auf die Datenbank zugreifen, auch solche, die die gleichen Tabellen verwenden – DFL

+0

Bitte überprüfen Sie diesen Beitrag http://stackoverflow.com/questions/23753510/timeout-implementation-of-jpa-transactions-and-session-invalidation – shankarsh15