Tomcat上的Grails Oracle - JNDI配置 - InstanceAlreadyExistsException等错误

时间:2017-04-21 01:31:30

标签: oracle tomcat grails spring-boot jndi

我从Grails 2过渡到Grails 3,并处理Tomcat上有关Oracle的Jndi数据源的问题,Tomcat 7和Tomcat 8.5之间存在差异。

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

这是我将一直用于Tomcat连接到我的Oracle数据库的jndi配置,这是从我的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"
          />    

所以当我在Tomcat 7上使用我的Grails 3应用程序时...它工作正常,我没有问题。但是当在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:java.net.URLClassLoader@13221655;ClassLoader:ParallelWebappClassLoader

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

上述链接还提出了其他解决方案,例如设置:

spring.jmx.enabled: false

但是在我继续尝试不同的事情之前......是否有人可以建议如何设置JNDI资源的正确/标准方式?例如,我应该添加&#34;工厂&#34;然后尝试解决由此产生的错误?

说明我的应用的一些细节:

  • 这是Grails 3应用程序,使用Grails 3.2.8
  • 我希望能够将WAR文件部署到Tomcat 7和Tomcat 8.5
  • 它使用Oracle数据库
  • 使用Grails 2版本的应用程序,我在Tomcat 7和Tomcat 8.5中都没有收到任何错误
  • 使用Grails 3版本的应用程序,我在Tomcat 7中没有收到任何错误。但在Tomcat 8.5中,我确实收到错误,从&#34; InstanceAlreadyExists&#34;例外

1 个答案:

答案 0 :(得分:0)

从我在下面的页面上看到的,我确实需要将JNDI工厂属性设置为org.apache.tomcat.jdbc.pool.DataSourceFactory。我之后会得到异常的原因&#34; java.lang.ClassNotFoundException:无法加载类:oracle.jdbc.OracleDriver&#34;是因为它还需要将ojdbc JAR文件放在Tomcat \ Lib文件夹中。这对我来说是新的,因为我从来没有用Grails 2做过这一点,Grails 3也没有用Tomcat 7这样做......它似乎只与Grails 3和Tomcat 8(或8.5)及以后一起发挥作用。

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