2017-11-23 1 views
2

Ich habe eine Methode geschrieben in einem Grails-Dienst, der eine Menge Daten verarbeitet.
Ich habe festgestellt, dass manchmal die Methode Erfolg zurückgibt, aber die Daten nicht in der Datenbank gespeichert werden.Wie kann man wissen, ob Daten während der Datenbanktransaktion nach dem Zurückgeben der Methode erhalten wurden?

Ich debuggte es, alle Daten bis zum Ende der Methode und alles ist in Ordnung, aber Daten werden nicht beibehalten.

Das folgende Bild zeigt das, was ich gerade erklärt habe. Sie können das Ende der Methode sehen, in der ein Map-Objekt mit persistenten Objektmetadaten gefüllt ist. Auch können Sie die Konsole sehen, die die printend enthält Hibertate SQL

Debugging

Wie kann ich erkennen, ob ein Rollback-Mechanismus nach der erfolgreichen Methode Rückkehr geworfen wird?

Dies ist meine Verbindungseigenschaften für Oracle 12c-Datenbank. Andere Konfigurationen sind Grails defaults

dataSource.pooled=true 
hibernate.jdbc.use_get_generated_keys=true 
hibernate.cache.use_second_level_cache=true 
hibernate.cache.use_query_cache=false 
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory 
dataSource.driverClassName=oracle.jdbc.driver.OracleDriver 
dataSource.dialect=org.hibernate.dialect.OracleDialect 

dataSource.url=jdbc:oracle:thin:@172.16.1.20:1521:db 
dataSource.username=<USER> 
dataSource.password=<PASS> 
hibernate.default_schema=<SCHEMA> 

Der Service als @Transactional

@Transactional 
class SincronizacionService { 

} 

Jede Idee anotated ist?

+0

Ich habe gerade den Fragetitel bearbeitet, also vielleicht gibt es ein besseres Verständnis davon – lealceldeiro

+0

Wahrscheinlich mit Ihrem _setup_ müssen Sie das Commit auf die Transaktion manuell aufrufen. Können Sie Ihre überwachte Konfiguration teilen? Welchen Transaktionsmanager benutzen Sie? In welcher Umgebung bist du? – gtosto

+1

Der Code gehört zu einer Grails-Anwendung. Ich habe die Frage mit meiner benutzerdefinierten Konfiguration bearbeitet. Dies geschieht in allen Umgebungen [Entwicklungen | Test | Produktion]. Der Dienst ist mit @Transactional zu –

Antwort

2

ich das Problem gefunden . Bei dieser Methode actaDenunciaService.generarActaDenuncia(denuncia) gibt es eine Besonderheit. In einem Teil des Verfahrens ist der folgende Code-Schnipsel zu finden:

  try { 
       DNomenclador nomenclador = nomencladorService.obtenerNomencladorDNomenclador(meta.valor.toLong()) 
       if (!nomenclador) { 
        return toReturn(limpiarTexto(meta.valor)) 
       } else { 
        return toReturn(nomenclador.valor) 
       } 
      } catch (Exception e) { 
       return toReturn(limpiarTexto(meta.valor)) 
      } 

Ein Teammitglied diese Zeile geändert nomencladorService.obtenerNomencladorDNomenclador(meta.valor.toLong()). Die Änderung stellte eine enorme Verbesserung der Speicherersparnis dar. Das Teammitglied hat jedoch einen Geschäftsprozess nicht berücksichtigt, der die von ihm verwendete Methode nicht berücksichtigt.

Ja, eine Laufzeitausnahme wird ausgelöst.

Und die Behandlung je nach Ziel des Verfahrens ist es, richtig

Für die Zukunft ist dies, wie das Verfahren von jetzt an wird:

  try { 
       DNomenclador nomenclador = nomencladorService.obtenerNomencladorDNomencladorLibre(meta.valor.toLong()) 
       if (!nomenclador) { 
        return toReturn(limpiarTexto(meta.valor)) 
       } else { 
        return toReturn(nomenclador.valor) 
       } 
      } catch (Exception e) { 
       e.printStackTrace() 
       return toReturn(limpiarTexto(meta.valor)) 
      } 
  • nomencladorService.obtenerNomencladorDNomencladorLibre(meta.valor.toLong()) für das Geschäft verarbeiten
  • e.printStackTrace() für andere Besonderheit Tracing

Vielen Dank an alle, die bei der Suche nach diesem Fehler mitgeholfen haben

2

Wenn Sie die Speichermethode von GORM verwenden, verwenden Sie auch failOnError: true. Standardmäßig schlägt das Speichern der Methode automatisch fehl. Wenn Sie jedoch failOnError: true verwenden, wird eine Ausnahme ausgelöst, wenn die Daten nicht beibehalten werden.

Wenn Sie das Programm nicht anhalten möchten, wenn die Daten nicht gespeichert werden, können Sie den try-catch-Block verwenden, um Daten zu protokollieren, die nicht gespeichert werden konnten, und der Algorithmus funktioniert weiterhin.

Hoffnung, das hilft.

+0

Ich werde es testen. In ein paar Minuten werde ich Ihnen antworten –

+0

Nein, diese Lösung funktioniert nicht –

1

Ich habe den Fehler gefunden!

Ein Fehler, der in einer Methode zum Generieren eines PDF-Dokuments mit Daten ausgelöst wird, scheint fehlzuschlagen. Die zweite Zeile dieses zeigt

 try { 
      denuncia.xmlFirmadoServ = dfileManagerService.guardarDFile(signatureResponse.resultado, "xmlfirmadoservidor.xml", usuario) 
      denuncia = actaDenunciaService.generarActaDenuncia(denuncia).denuncia 
     } catch (Throwable t) { 
      denunciaUtilService.incrementarNumeroDenuncia(true) 
      throw t 
     } 

Nun wird die neue Frage ist: Wird das Verfahren in einem Block try/catch eingekapselt ist, warum der catch-Block wird excecuting nicht?

Als ich die zweite Zeile in try/catch Block kommentieren, Daten auf Datenbank beibehalten werden

Ohne Kommentare, Generation PDF Methode wird bis zum Ende ausgeführt, alles zu tun, was es tun muss

Verwandte Themen