【问题标题】:Grails Oracle on Tomcat - JNDI config - error on InstanceAlreadyExistsException, etcTomcat 上的 Grails Oracle - JNDI 配置 - InstanceAlreadyExistsException 等错误
【发布时间】:2017-09-17 20:25:08
【问题描述】:

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

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

这是我将始终用于 Tomcat 连接到我的 Oracle DB 的 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 资源的正确/标准方式吗?例如,我是否应该添加“工厂”,然后尝试解决由此导致的错误?

陈述我的应用的一些细节:

  • 这是一个 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 中我确实收到了错误,从“InstanceAlreadyExists”异常开始

【问题讨论】:

    标签: oracle tomcat grails spring-boot jndi


    【解决方案1】:

    从我在下面页面看到的内容来看,我确实需要将 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2011-09-11
      • 2012-01-21
      • 2021-10-17
      • 2012-05-28
      相关资源
      最近更新 更多