【发布时间】: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