2010-11-11 5 views
2

J'ai du mal à obtenir le cache de 2ème niveau pour hiberner travaillant sous Grails.Obtenir hibernate & ehcache pour fonctionner avec READ_WRITE sous Grails sur JBoss 4.2.1.GA

J'ai donc une application utilisant Grails 1.3.5 qui doit être déployée sur JBoss 4.2.1.GA.

Le choix du serveur d'application n'est pas le mien et donc malheureusement ne peut pas être changé/mis à jour. À l'origine, j'ai simplement activé le deuxième niveau et le cache de requête et défini le fournisseur sur EhCache. Mes requêtes et entités ont ensuite été marquées de façon appropriée pour la mise en cache et j'utilise la stratégie READ_WRITE car elles changeront au fil du temps.

Quand je déployé l'application Web pour JBoss et a commencé cette génèrerait l'avertissement suivant:

21: 24: 36585 INFO [TransactionManagerLookupFactory] Non TransactionManagerLookup configuré (dans un environnement JTA, l'utilisation de lecture-écriture ou cache de deuxième niveau transactionnel n'est pas recommandé)

Maintenant, cela cause un réel problème. J'ai un service d'importation de données qui mettra à jour à peu près toutes les entités du système au sein d'une seule transaction. L'exécution peut prendre un certain temps, mais les modifications ne doivent pas apparaître tant que le processus n'est pas engagé. Cela fonctionne maintenant bien en mode de développement (c'est-à-dire grails run-app) dans Tomcat. Cependant, dans JBoss, les modifications sont disponibles dès qu'elles sont effectuées dans le cache et non lorsque la transaction est validée. Je suppose que c'est à cause de l'avertissement d'environnement JTA montré ci-dessus.

Maintenant, j'ai essayé de résoudre ce problème en ajoutant la classe de fabrique de transactions et le gestionnaire de recherche pour Hibernate.

L'extrait correspondant du DataSource.groovy est:

hibernate { 
    generate_statistics=true 
    cache.use_second_level_cache = true 
    cache.use_query_cache = true 
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
} 

environments { 

    ... 

    production { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop','update' 
      url = "jdbc:mysql://localhost:3306/myschema" 
      driverClassName = "com.mysql.jdbc.Driver" 
      username = "root" 
      password = "password" 
    } 
    hibernate { 
     transaction.factory_class = "org.hibernate.transaction.JTATransactionFactory" 
     transaction.manager_lookup_class = "org.hibernate.transaction.JBossTransactionManagerLookup" 
    } 
} 

}

Le problème est quand je vais maintenant essayer et déployer l'application que je reçois ce ClassCastException:

Causée par: org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'transactionManager': Impossible de résoudre la référence au bean 'sessionFactory' lors de la définition de la propriété bean 'sessionFactory'; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'sessionFactory': l'invocation de la méthode init a échoué; exception imbriquée est java.lang.ClassCastException: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate ne peut pas être jeté à javax.transaction.TransactionManager ... 129 plus

Maintenant, j'ai eu un Google autour et Quelqu'un a suggéré que cela a été causé par l'inclusion de jta.jar dans l'application Web. Donc, je l'ai supprimé en utilisant ce script groovy dans le BuidConfig.fichier groovy (supprime également des pots de diagraphie, nécessaires pour le faire fonctionner sur JBoss):

grails.war.resources = {stagingDir -> 
    // Extra Libraries to remove 
    def toRemove = ["$stagingDir/WEB-INF/lib/log4j-1.2.15.jar", 
    "$stagingDir/WEB-INF/lib/slf4j-log4j12-1.5.8.jar", 
    "$stagingDir/WEB-INF/lib/slf4j-api-1.5.8.jar", 
    "$stagingDir/WEB-INF/lib/jta.jar"].each { 
     delete(file: it) 
    } 
} 

Cependant cela ne fonctionne pas et je me suis exactement la même erreur.

Toute aide serait grandement appréciée. Avoir passé un certain temps à googler sans succès. Ce n'est pas la première douleur que j'ai eu à travailler sur JBoss et je suis sûr que ce ne sera pas la dernière!

Répondre

2

J'ai trouvé le problème avec ceci, j'aurais dû supprimer le fichier jta-1.1.jar. Cela a fait l'affaire!

Questions connexes