2017-04-21 1 views
0

Je suis en train de passer de Grails 2 à Grails 3, et de traiter un problème en ce qui concerne la source de données Jndi pour Oracle sur Tomcat, avec une différence entre Tomcat 7 et Tomcat 8.5. En bref, avec mon application Grails 3 ... Je reçois une erreur sur Tomcat 8.5 que je ne reçois pas sur Tomcat 7. Avec mon application Grails 2, je n'aurais pas l'erreur sur Tomcat 8.5 ni sur Tomcat 7.Grails Oracle sur Tomcat - JNDI config - erreur sur InstanceAlreadyExistsException, etc

Ceci est la configuration JNDI je toujours utiliser Tomcat pour se connecter à mon Oracle DB, qui est référencé à partir de mon Grails application:

<Resource name="jdbc/myGrails" auth="Container" 
      type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
      url="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = local)))" 
      username="USER" password="PW" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      />  

Ainsi lors de l'utilisation avec mes Grails 3 app sur Tomcat 7 ... Ca marche bien et je n'ai pas de problèmes. Mais lorsque j'utilise la même application Grails 3 sur Tomcatt 8.5, j'obtiens une instance InstanceAlreadyExistsException, et l'application ne démarre pas. Je suis tombé sur cette page qui détaille cette erreur: https://github.com/grails/grails-core/issues/9424

L'une des solutions proposées sur ce fil était d'ajouter:

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

Pour la configuration JNDI ... J'ai essayé, et je obtenir un résultat étrange: j'obtiendrais une erreur/exception, mais l'application fonctionnerait avec succès, au moins les parties que j'ai testées jusqu'ici. Ceci est l'exception que je reçois:

java.lang.ClassNotFoundException: Unable to load class: oracle.jdbc.OracleDriver from ClassLoader:[email protected];ClassLoader:ParallelWebappClassLoader 

Encore une fois, même à cette exception près, l'application ne fonctionne correctement et se connecter à la base de données. Mais je suis préoccupé par l'effet que cette exception aurait sur l'application.

Le lien mentionné ci-dessus suggère également d'autres solutions, telles que la définition:

spring.jmx.enabled: false 

Mais avant que je continue à re-essayer différentes choses ... Est-ce que quelqu'un at-il une façon correcte/standard peut suggérer la façon de définir la ressource JNDI? Par exemple, devrais-je ajouter le "factory" et ensuite essayer de résoudre l'erreur qui en résulte?

Énoncer quelques détails de mon application:

  • Il est une application Grails 3, en utilisant Grails 3.2.8
  • Je veux être en mesure de déployer le fichier WAR pour à la fois Tomcat 7 et Tomcat 8.5
  • Il utilise une version base de données Oracle
  • Avec la Grails version 2 de l'application, je ne suis pas d'erreurs dans Tomcat 7 ni dans Tomcat 8.5
  • Avec les Grails 3 de l'application, je ne » t obtenir des erreurs dans Tomcat 7. Mais dans Tom cat 8.5 Je reçois des erreurs, en commençant à l'exception « InstanceAlreadyExists »

Répondre

0

D'après ce que je vois sur la page ci-dessous, j'ai besoin de définir la propriété de l'usine JNDI à org.apache.tomcat.jdbc.pool. DataSourceFactory. La raison pour laquelle j'obtiendrais alors l'exception "java.lang.ClassNotFoundException: Impossible de charger la classe: oracle.jdbc.OracleDriver" est qu'il faut également placer le fichier JAR ojdbc dans le dossier Tomcat \ Lib. C'est nouveau pour moi car je n'ai jamais eu à le faire avec Grails 2, et Grails 3 avec Tomcat 7 ne l'exige pas ... Il semble ne jouer qu'avec Grails 3 et Tomcat 8 (ou 8.5) et plus.

http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency