我正在从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”异常