2017-04-21 68 views
0

我正在从Grails 2过渡到Grails 3,并处理Tomcat上与Oracle有关的Jndi数据源问题,Tomcat 7和Tomcat 8.5。Tomcat上的Grails Oracle - JNDI配置 - InstanceAlreadyExistsException中的错误等

简而言之,用我的Grails 3应用程序...我在Tomcat 8.5上遇到了一个错误,我没有在Tomcat 7上得到。使用我的Grails 2应用程序,我不会在Tomcat 8.5上得到错误,也不会在Tomcat 7

这是JNDI的配置我会一直使用Tomcat的连接到我的Oracle数据库,这是从我的Grails应用程序中引用:

<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" 
      />  

所以,当我的Grails应用程序3使用此在Tomcat 7上...它工作正常,我没有问题。但是当在Tomcatt 8.5上使用相同的Grails 3应用程序时,我得到一个InstanceAlreadyExistsException,并且该应用程序没有启动。我来到这个页面,详细说明了错误: https://github.com/grails/grails-core/issues/9424

一个在该线程建议的解决方案之一是增加:

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

到JNDI配置。我试过了,并且会得到一个奇怪的结果:我会得到一个错误/异常,但该应用程序会成功运行,至少是我到目前为止测试的部分。这是我得到的例外:

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

再次,即使有这种例外,应用程序确实运行并连接到数据库。但是我担心这个例外会对应用程序产生什么影响。

上面还建议其他的解决方案,如设置中提到的链接:

spring.jmx.enabled: false 

,但我一直重新尝试不同的东西......之前是否有一个正确的/标准方式有人可以建议对如何设置JNDI资源?例如,我应该添加“工厂”,然后尝试解决由此导致的错误?

要说明我的应用程序的一些细节:

  • 这是一个Grails应用3,使用Grails 3.2.8
  • 我希望能够部署WAR文件它把Tomcat 7和Tomcat都8.5
  • 它使用Oracle数据库
  • 随着Grails的2.0版本的应用程序,我不Tomcat的7也不在Tomcat的8.5得到任何错误
  • 随着Grails的3.0版本的应用程序,我不不会在Tomcat 7中发生任何错误,但在Tom中猫8.5我得到的错误,开始与“InstanceAlreadyExists”异常

回答

0

从我所看到的页面下,我需要设置JNDI工厂属性org.apache.tomcat.jdbc.pool。 DataSourceFactory。之所以我会得到异常“java.lang.ClassNotFoundException:无法加载类:oracle.jdbc.OracleDriver”是因为它还需要将ojdbc JAR文件放在Tomcat \ Lib文件夹中。这对我来说是新的,因为我从来没有必须对Grails 2做这件事,对于Tomcat 7来说Grails 3也不需要它......似乎只有在Grails 3和Tomcat 8(或8.5)及之后才能发挥作用。

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