我从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;然后尝试解决由此产生的错误?
说明我的应用的一些细节:
答案 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