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

标签 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 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 资源提出正确/标准的建议?例如,我应该添加“工厂”然后尝试解决由此产生的错误吗?

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

  • 这是一个 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”异常开始

最佳答案

根据我在下面页面上看到的内容,我确实需要将 JNDI 工厂属性设置为 org.apache.tomcat.jdbc.pool.DataSourceFactory。然后我会得到异常“java.lang.ClassNotFoundException:无法加载类:oracle.jdbc.OracleDriver”的原因是因为它还需要将 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

关于oracle - Tomcat 上的 Grails Oracle - JNDI 配置 - InstanceAlreadyExistsException 等错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43532451/

相关文章:

sql - 在多个 Oracle 数据库上执行 SQL 脚本

java - Spring oracle数据源不破坏连接

java - 使用带有 tomcat 的 c3p0 与 MySQL 的僵尸连接

sorting - Grail域模型关联对多个字段的默认排序

grails - Grails GORM按对象属性的属性查找

oracle - 我们能否找到哪个表导致ORA-00942表或 View 不存在。 :

java.sql.SQLSyntaxErrorException : ORA-01729: database link name expected while using Java stored procedure

session - grails SQL 错误

java - 下载大型视频文件被损坏

grails - 发布 Grails 3 插件时出现 NullPointerException