2017-11-23 12 views
2

많은 데이터를 처리하는 Grails 서비스로 작성된 메소드가 있습니다.
가끔씩 메서드가 성공을 리턴하지만 데이터가 데이터베이스에 저장되지 않는 것으로 나타났습니다.메서드가 반환 된 후 데이터베이스 트랜잭션 중에 데이터가 보존되었는지 어떻게 알 수 있습니까?

나는 방법의 끝날 때까지 모든 데이터를 따라 디버깅했지만 모든 것이 정상이지만 데이터는 지속되지 않습니다.

다음 이미지는 방금 설명한 내용을 보여줍니다. Map 객체가 영구 객체 메타 데이터로 채워지는 메소드의 끝을 볼 수 있습니다. 비록 당신이 printend이 들어있는 콘솔을 볼 수 있습니다 Hibertate SQL

롤백 메커니즘이 성공적인 방법은 복귀 후 발생 여부를 내가 감지 할 수있는 방법

Debugging

?

이것은 Oracle 12c 데이터베이스의 연결 속성입니다. 기타 구성이 서비스는 @Transactional

@Transactional 
class SincronizacionService { 

} 

어떤 생각으로 anotated됩니다

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> 

Grails의 기본값입니까?

+0

방금 ​​질문 제목을 편집 했으므로 더 잘 이해할 수 있습니다. – lealceldeiro

+0

아마도 _setup_을 사용하여 트랜잭션에서 커밋을 수동으로 호출해야합니다. 최대 절전 모드 구성을 공유 할 수 있습니까? 어떤 트랜잭션 관리자를 사용하고 있습니까? 너는 어느 환경에서? – gtosto

+1

코드는 Grails 애플리케이션에 속합니다. 내 사용자 지정 구성으로 질문을 편집했습니다. 이것은 모든 환경에서 발생합니다 [개발 | 테스트 | 생산]. 서비스에 @Transactional도 덧붙여졌습니다 –

답변

2

해야 할 일을 모두하고, 마지막까지 실행 . 이 방법 actaDenunciaService.generarActaDenuncia(denuncia)에는 특이성이 있습니다. 방법의 부분에서 다음 코드를 위치 :

  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)) 
      } 

팀 구성원이 줄 nomencladorService.obtenerNomencladorDNomenclador(meta.valor.toLong())을 변경했습니다. 변화는 메모리 절약의 엄청난 향상을 나타냅니다. 그러나 팀 구성원은 자신이 사용한 방법을 고려하지 않은 비즈니스 프로세스를 고려하지 않았습니다.

예, 런타임 예외가 발생합니다.비즈니스에 대한

  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()) :

    그리고 치료, 방법의 목적에 따라, 미래에 대한

    올바른지,이 방법은 지금부터 얼마나입니다 다른 특질을 추적하는

  • e.printStackTrace()를 처리

이 오류를 찾는 데 협조 해 주신 모든 분께 감사드립니다.

2

GORM의 save 메소드를 사용할 때는 failOnError : true도 사용하십시오. 기본적으로 save 메소드는 자동으로 실패합니다. 그러나 failOnError : true를 사용하면 데이터가 지속되지 않는 경우 예외가 발생합니다.

데이터 저장에 실패 할 때 프로그램을 중지하지 않으려는 경우 try-catch 블록을 사용하여 저장하지 못한 데이터를 기록하고 알고리즘이 계속 작동하도록 할 수 있습니다.

희망이 있습니다.

+0

나는 그것을 시험 할 것이다. 잠시 후 응답하겠다. –

+0

아니, 그 해결책이 효과가 없다. –

1

오류를 발견했습니다!

데이터가 포함 된 PDF 문서를 생성하는 방법에서 발생하는 오류는 실패한 것처럼 보입니다. 두 번째 줄 지금이

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

을 보여주고, 새로운 질문은 :이 방법은 try/catch 블록 내부에 캡슐화되어있는 경우, 왜 catch 블록은 excecuting되지 않는 이유는 무엇입니까? 내가 try/catch 블록 내부의 2 라인을 언급 할 때

, 데이터 댓글 없음으로 데이터베이스

에 지속되고, 생성 된 PDF 방법은 내가 문제를 발견