2017-02-09 2 views
1

Ich versuche, meine Grails-App von 3.1.10 auf 3.2.5 zu aktualisieren, um neue GORM usw. zu verwenden, aber der Start schlägt fehl, wenn Datenbankmigrationen erreicht werden.Fehler beim Aktualisieren der Grails-App von 3.1.10 auf 3.2.5

ich:

INFO 2/9/17 2:08 PM: liquibase: Can not use class org.grails.plugins.databasemigration.liquibase.GormDatabase as a Liquibase service because it does not have a no-argument constructor 
ERROR org.springframework.boot.SpringApplication - Application startup failed 
org.springframework.transaction.HeuristicCompletionException: Heuristic completion: outcome state is rolled back; nested exception is org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction 
at org.grails.transaction.ChainedTransactionManager.commit(ChainedTransactionManager.java:183) 
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150) 
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93) 
at grails.transaction.GrailsTransactionTemplate$execute.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
at org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager.withTransaction(DatabaseMigrationTransactionManager.groovy:31) 
at org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager$withTransaction.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
at org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin$_doWithApplicationContext_closure2.doCall(DatabaseMigrationGrailsPlugin.groovy:77) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024) 
at groovy.lang.Closure.call(Closure.java:414) 
at groovy.lang.Closure.call(Closure.java:430) 
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030) 
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2015) 
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2068) 
at org.codehaus.groovy.runtime.dgm$164.invoke(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
at org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin.doWithApplicationContext(DatabaseMigrationGrailsPlugin.groovy:63) 
at org.grails.plugins.DefaultGrailsPlugin.doWithApplicationContext(DefaultGrailsPlugin.java:523) 
at org.grails.plugins.AbstractGrailsPluginManager.doPostProcessing(AbstractGrailsPluginManager.java:224) 
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:246) 
at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy) 
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167) 
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383) 
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337) 
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) 
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) 
at grails.boot.GrailsApp.run(GrailsApp.groovy:83) 
at grails.boot.GrailsApp.run(GrailsApp.groovy:388) 
at grails.boot.GrailsApp.run(GrailsApp.groovy:375) 
at grails.boot.GrailsApp$run.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) 
at saasapi.Application.main(Application.groovy:8) 
Caused by: org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:704) 
at org.grails.transaction.MultiTransactionStatus.commit(MultiTransactionStatus.java:73) 
at org.grails.transaction.ChainedTransactionManager.commit(ChainedTransactionManager.java:156) 
... 56 common frames omitted 

Ich habe meine build.gradle die folgenden Abhängigkeiten aktualisiert oder hinzugefügt:

buildscript { 
    ... 
    dependencies { 
     .... 
     classpath "org.grails.plugins:hibernate5:6.0.4" 
     classpath 'org.grails.plugins:database-migration:3.0.0' 
    } 
} 

dependencies { 
    ... 
    runtime 'mysql:mysql-connector-java:5.1.40' 
    compile "org.grails.plugins:hibernate5" 
    compile "org.hibernate:hibernate-core:5.1.1.Final" 
    compile "org.hibernate:hibernate-ehcache:5.1.1.Final" 
    runtime 'org.grails.plugins:database-migration:3.0.0' 
    compile 'org.liquibase:liquibase-core:3.5.3' 
    compile 'org.grails.plugins:mongodb' 
} 

Die Menschen haben Fehler Liquibase „PM gesehen: liquibase: Kann nicht-Klasse verwenden org .grails.plugins.database.migration.liquibase.GormDatabase als Liquibase-Dienst, da es in diesen Github-Problemen zuvor keinen Konstruktor ohne Argumente gibt:

https://github.com/grails-plugins/grails-database-migration/issues/81

https://github.com/grails-plugins/grails-database-migration/issues/64#issuecomment-256739113

Aber für sie war es kein Bruch Fehler.

Als ich versuchte, auf Grails 3.2.3 zu aktualisieren, sah ich auch diese liquibase Fehlermeldung, aber sonst funktionierte alles andere (Migrationsprotokolle waren auch nicht sichtbar). Vielleicht liegt das Problem darin, dass Grails 3.2.3 Spring Boot 1.4.1 verwendet, Grails 3.2.5 aber Spring Boot 1.4.4.

Wie auch immer ich bin verloren und ich hoffe, dass mir jemand helfen kann.

EDIT: Ich verwendete Datenbank-Migrations-Plugin, um meine Datenbanktabellen einzurichten und ich benutze es auch für die Änderung jetzt. Außerdem habe ich Datenbank-Migrationen beim Start aktiviert.

EDIT2: Es scheint, dass das Problem selbst nicht so sehr in Bezug auf Datenbankmigrationen

ich mehrere Datenquellen (relevante Teile von application.yml):

hibernate: 
    cache: 
     queries: false 
     use_second_level_cache: true 
     use_query_cache: false 
     region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 

dataSources: 
    dataSource: 
     pooled: true 
     jmxExport: true 
     driverClassName: com.mysql.jdbc.Driver 
     dialect: org.hibernate.dialect.MySQL5InnoDBDialect 
     dbCreate: none 
     properties: 
      testOnBorrow: true 
      validationQuery: SELECT 1 
    myOtherDataSource: 
     pooled: true 
     jmxExport: true 
     driverClassName: net.sourceforge.jtds.jdbc.Driver 
     dialect: org.hibernate.dialect.SQLServerDialect 
     dbCreate: none 

environments: 
    development: 
     dataSources: 
      dataSource: 
       url: jdbc:mysql://localhost/my_default_db?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true 
       username: my_user 
       password: my_pass 
      myOtherDataSource: 
       driverClassName: com.mysql.jdbc.Driver 
       dialect: org.hibernate.dialect.MySQL5InnoDBDialect 
       url: jdbc:mysql://localhost/my_other_db?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10 
       username: my_user 
       password: my_pass 

Auch kann ich anfangen Meine App, wenn es keine Datenbankmigrationen beim Start gibt, aber dann bekomme ich andere Fehler im Zusammenhang mit db:

Antwort

0

Ich habe ein Problem für diese, mit einer Beispielanwendung reproduziert dieses Verhalten erstellt: https://github.com/grails/grails-core/issues/10477

[Update]:

Habe ich es endlich. Grails erstellt einen Platformtransactionmanager für jede Konfiguration unter dataSources und einen für die Standard-dataSource. In Ihrem Beispiel sieht das so aus [dataSource, myOtherDataSource, dataSource]. Das ist offensichtlich nicht was passieren soll. In der GORM-Dokumentation wird angegeben, dass Sie Folgendes verwenden sollten:

dataSource: 
    .. 
dataSources: 
    myOtherDataSource: 

Dies wird funktionieren. Grails erstellt zwei Plattformtransaktionsmanager und das ist das richtige Verhalten.

Die Datenbankmigration erwartet jedoch, dass sich alle Datenquellen im dataSources-Konfigurationsblock befinden, sodass die Standarddatenquelle nicht gefunden werden kann. Ich habe einen Patch dafür erstellt und werde einen Pullrequest dafür erstellen, sobald ein anderer verwandter Bug behoben wird;

Grails veröffentlicht nicht die Standard-DataSource mit dem Namen 'dataSource' im applicationContext in einer Multi DataSource-Konfiguration. Ich habe dies auf die Frage hinzugefügt https://github.com/grails/grails-core/issues/10477

[Update 2]:

ich zwei Pull-Anforderungen erstellt haben, dieses Problem zu lösen:

Grails-Plugins/Grails-Datenbank-Migration/ziehen/123

und

grails/grails-core/Zug-/10478

Diese lösten das Problem auf meinem System. Ich konnte zwei Links nicht posten, da ich nach stackoverflow nicht genügend Reputation habe: S

+0

Ich weiß, dass Stack Overflow empfiehlt, nicht in Kommentaren zu danken, aber immer noch, vielen Dank für das Erstellen dieses Problems. – siimval

0

Ich habe fast die gleiche Einstellung wie Sie und keine Probleme von mir. Die wichtigsten Änderungen, die ich habe, ist, dass ich 5.1.3 Finale von Hibernate-Core und ehcache und org.grails.plugins: Hibernate5: 6.0.6. Ich habe keine Mongodb-Abhängigkeit.

  • Haben Sie mehrere Datenquellen?
  • Wird es gestartet, ohne eine Migrationsdatei auszuführen?
+0

Ja, ich habe mehrere verschiedene Datenquellen. Aber nur einer wird für Datenbankmigrationen verwendet. Ich werde die relevanten Teile aus meiner application.yml in meinem ursprünglichen Post bereitstellen. Ja, es startet, ohne Migrationsdateien auszuführen. Aber dann bekomme ich alle Arten von verschiedenen Fehlern im Zusammenhang mit DB-Verbindungen. Ich werde aussagekräftige Beispielzeilen aus Fehler-Stack-Traces in meinem ursprünglichen Post bereitstellen. – siimval

0

Ich habe das fast gleiche Problem mit Grails-3.2.5/3.2.6. Bitte versuchen Sie Grails-3.2.4 und sehen Sie, ob das Problem weiterhin auftritt oder nicht.

0

Mit mehreren Datenquellen habe ich das gleiche Problem. Es passiert nur auf der Standard-Datenquelle, es sieht aus wie die GrailsTemplate es versucht, einen vorherigen Zustand wiederherzustellen und dies nicht zu tun, weil die Transaktion festgeschrieben wurde.

org.springframework.transaction.HeuristicCompletionException: Heuristic completion: outcome state is rolled back; nested exception is org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction 
    at org.grails.transaction.ChainedTransactionManager.commit(ChainedTransactionManager.java:183) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150) 
    at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:93) 
    at grails.transaction.GrailsTransactionTemplate$execute.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager.withTransaction(DatabaseMigrationTransactionManager.groovy:31) 
    at org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager$withTransaction.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin$_doWithApplicationContext_closure2.doCall(DatabaseMigrationGrailsPlugin.groovy:77) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1426) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024) 
    at groovy.lang.Closure.call(Closure.java:414) 
    at groovy.lang.Closure.call(Closure.java:430) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2015) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2068) 
    at org.codehaus.groovy.runtime.dgm$164.invoke(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin.doWithApplicationContext(DatabaseMigrationGrailsPlugin.groovy:63) 
    at org.grails.plugins.DefaultGrailsPlugin.doWithApplicationContext(DefaultGrailsPlugin.java:523) 
    at org.grails.plugins.AbstractGrailsPluginManager.doPostProcessing(AbstractGrailsPluginManager.java:224) 
    at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:246) 
    at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167) 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383) 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337) 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:144) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) 
    at grails.boot.GrailsApp.run(GrailsApp.groovy:83) 
    at grails.boot.GrailsApp.run(GrailsApp.groovy:388) 
    at grails.boot.GrailsApp.run(GrailsApp.groovy:375) 
    at grails.boot.GrailsApp$run.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) 
    at scd.Application.main(Application.groovy:8) 
    Caused by: org.springframework.transaction.IllegalTransactionStateException: Transaction is already completed - do not call commit or rollback more than once per transaction 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:704) 
    at org.grails.transaction.MultiTransactionStatus.commit(MultiTransactionStatus.java:73) 
    at org.grails.transaction.ChainedTransactionManager.commit(ChainedTransactionManager.java:156) 
    ... 56 common frames omitted 
+0

Ich habe einen kleinen Testfall gemacht, der nicht fehlgeschlagen ist. Nachdem ich meine Domain-Klassen aus dem ursprünglichen Projekt kopiert habe, ist es erneut fehlgeschlagen. Nach einigen Versuchen und Fehlern habe ich festgestellt, dass dieser Fehler auftritt, wenn Sie 32 oder mehr Domänenklassen haben. –

Verwandte Themen