J'ai une méthode écrite dans un service Grails, qui traite beaucoup de données.
J'ai remarqué que, parfois, la méthode renvoie le succès mais les données ne sont pas conservées dans la base de données.

Je l'ai débogué, en suivant toutes les données jusqu'à la fin de la méthode et tout va bien, mais les données ne sont pas persistantes.

L'image suivante montre ce que je viens d'expliquer. Vous pouvez voir la fin de la méthode, dans laquelle un objet Map est rempli de métadonnées d'objet persistantes. Même vous pouvez voir la console qui contient le printend Hibertate SQL

Debugging

Comment puis-je détecter si un mécanisme de restauration est lancé après le retour d'une méthode réussie?

Ce sont mes propriétés de connexion pour la base de données Oracle 12c. Les autres configurations sont des valeurs par défaut Grails

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>

Le service est annoté comme @Transactional

@Transactional
class SincronizacionService {

}

Une idée?

2
Leandro Roura Sixto 23 nov. 2017 à 22:55

3 réponses

Meilleure réponse

J'ai trouvé le problème. Dans cette méthode actaDenunciaService.generarActaDenuncia(denuncia), il y a une particularité. Dans une partie de la méthode se trouve l'extrait de code suivant:

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

Un membre de l'équipe a modifié cette ligne nomencladorService.obtenerNomencladorDNomenclador(meta.valor.toLong()). Le changement a représenté une énorme amélioration de l'économie de mémoire. Cependant, le membre de l'équipe n'a pas pris en compte un processus métier, qui ne tient pas compte de la méthode qu'il a utilisée.

Oui, une exception d'exécution est levée.

Et le traitement, selon l'objectif de la méthode, est correct

Pour l'avenir, voici comment la méthode sera désormais:

            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()) pour le processus métier
  • e.printStackTrace() pour tracer toute autre particularité

Merci beaucoup à tous ceux qui ont collaboré pour trouver cette erreur

2
lealceldeiro 13 déc. 2017 à 16:20

J'ai trouvé l'erreur!

Une erreur lancée dans une méthode de génération d'un document PDF avec des données semble échouer. La deuxième ligne montre ceci

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

Maintenant, la nouvelle question est: Si la méthode est encapsulée dans un bloc try/catch, pourquoi le bloc catch ne s'exécute pas?

Lorsque je commente la deuxième ligne dans le bloc try/catch, les données sont conservées dans la base de données

Sans commentaires, la méthode de génération PDF est exécutée jusqu'à la fin, faisant tout ce qu'elle doit faire

1
Leandro Roura Sixto 7 déc. 2017 à 23:37

Lorsque vous utilisez la méthode de sauvegarde de GORM, utilisez également failOnError: true. Par défaut, la méthode de sauvegarde échoue silencieusement. Cependant, si vous utilisez failOnError: true, il lèvera une exception si les données ne sont pas persistantes.

Si vous ne souhaitez pas arrêter le programme lorsque l'enregistrement des données échoue, vous pouvez utiliser le bloc try-catch pour enregistrer les données dont l'enregistrement a échoué et laisser l'algorithme continuer à fonctionner.

J'espère que cela pourra aider.

2
elixir 5 déc. 2017 à 18:41
47462551