无法在春季使用Tomcat提供的JNDI数据源? [英] Unable to use JNDI DataSource provided by Tomcat in Spring?

查看:85
本文介绍了无法在春季使用Tomcat提供的JNDI数据源?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在基于Spring的应用程序中使用Tomcat提供的JNDI数据源。我使用Tomcat 7池。尝试按照此处中所述进行配置。 / p>

已配置Tomcat的server.xml:

 < GlobalNamingResources> 
<资源名称= jdbc / ApsuserAtAzistst
auth =容器
type = org.apache.tomcat.jdbc.pool.DataSource
driverClassName = oracle .jdbc.OracleDriver
url = jdbc:oracle:thin:@ 10.0.153.10:1525:AZISTST
username = APSUSER
password = PASSWORDOFAPSUSER
initialSize = 1
minIdle = 1
maxIdle = 1
maxActive = 3
maxWait = 1000
validationQuery =从1中选择1 double
jdbcInterceptors = org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport (阈值= 1500)
/>
< / GlobalNamingResources>

创建了META-INF\context.xml,内容为:

 <?xml version = 1.0 encoding = UTF-8?> 
< Context>
< ResourceLink name = jdbc / ApsuserAtAzistst
global = jdbc / ApsuserAtAzistst
type = org.apache.tomcat.jdbc.pool.DataSource />
< / Context>

并配置了applicationContext.xml

 < beans profile = dev,test,default> 
< bean id = dataSource class = org.springframework.jndi.JndiObjectFactoryBean>
<属性名称= jndiName value = java:comp / env / jdbc / ApsuserAtAzistst />
< / bean>
< / beans>

运行应用程序时出现错误:

 严重:异常处理全局JNDI资源
javax.naming.NamingException:无法在org.apache.naming.factory.ResourceFactory.getObjectInstance( ResourceFactory.java:146)javax.naming.spi.NamingManager.getObjectInstance(未知源)
(org.apache.naming.NamingContext.lookup(NamingContext.java:843)
() org.apache.naming.NamingContext.java:154)
在org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:119)
在org.apache.naming.NamingContextBindingsEnumeration。 org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:36)的next(NamingContextBindingsEnumeration.java:73)
org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycle eListener.java:140)org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:147)
org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:
112)org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:84)中的
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
$ b在org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
在org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
在组织.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
在org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725)
在org.apache.catalina .util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.startup.Catalina.start (Catalina.java:684)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl。在java.lang.reflect.Method.invoke上调用(Unknown Source)
在org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
在org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)

一切正常当我将applicationContext.xml更改为:

 < beans profile = dev,test,default> 
< bean id = dataSource class = org.apache.tomcat.jdbc.pool.DataSource destroy-method = close>
<属性名称= driverClassName值= oracle.jdbc.OracleDriver />
<属性名称= url value = jdbc:oracle:thin:@ 10.0.153.10:1525:AZISTST />
<属性名称=用户名 value = APSUSER />
<属性名称=密码 value = PASSWORDOFAPSUSER />
<属性名称= initialSize值= 1 />
<属性名称= minIdle value = 1 />
<属性名称= maxIdle值= 1 />
<属性名称= maxActive值= 3 />
<属性名称= maxWait值= 1000 />
<属性名称= validationQuery value =从对偶中选择1 />
<属性名称= jdbcInterceptors
value = org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; org.apache .tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold = 1500) />
< / bean>
< / beans>

但是我想在Tomcat中配置JNDI数据源并使用它。

解决方案

原因是,我错过了factory = org.apache.tomcat.jdbc.pool.DataSourceFactory。正确的资源定义必须是

 < GlobalNamingResources> 
<资源名称= jdbc / ApsuserAtAzistst
auth =容器
type = javax.sql.DataSource
factory = org.apache.tomcat.jdbc .pool.DataSourceFactory
driverClassName = oracle.jdbc.OracleDriver
url = jdbc:oracle:thin:@ 10.0.153.10:1525:AZISTST
username = APSUSER
password = PASSWORDOFAPSUSER
initialSize = 1
minIdle = 1
maxIdle = 1
maxActive = 3
maxWait = 1000
validationQuery =从双中选择1
jdbcInterceptors = org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold = 1500)
/>
< / GlobalNamingResources>


I want to use JNDI DataSource provided by Tomcat in Spring based application. I use Tomcat 7 pool. Tried to configure as described here.

Configured server.xml of Tomcat:

  <GlobalNamingResources>
    <Resource name="jdbc/ApsuserAtAzistst"
              auth="Container"
              type="org.apache.tomcat.jdbc.pool.DataSource"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST"
              username="APSUSER"
              password="PASSWORDOFAPSUSER"
              initialSize="1"
              minIdle="1"
              maxIdle="1"
              maxActive="3"
              maxWait="1000"
              validationQuery="select 1 from dual"
              jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)"
            />
  </GlobalNamingResources>

created META-INF\context.xml with content:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink name="jdbc/ApsuserAtAzistst"
                  global="jdbc/ApsuserAtAzistst"
                  type="org.apache.tomcat.jdbc.pool.DataSource"/>
</Context>

and configured applicationContext.xml

<beans profile="dev,test,default">
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/ApsuserAtAzistst"/>
    </bean>
</beans>

When I run applcation I receive an error:

SEVERE: Exception processing Global JNDI Resources
javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:146)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:119)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:73)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:36)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:140)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:147)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:112)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:84)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:684)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)

Everything works when I change applicationContext.xml to:

<beans profile="dev,test,default">
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST"/>
        <property name="username" value="APSUSER"/>
        <property name="password" value="PASSWORDOFAPSUSER"/>
        <property name="initialSize" value="1"/>
        <property name="minIdle" value="1"/>
        <property name="maxIdle" value="1"/>
        <property name="maxActive" value="3"/>
        <property name="maxWait" value="1000"/>
        <property name="validationQuery" value="select 1 from dual"/>
        <property name="jdbcInterceptors"
                  value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)"/>
    </bean>
</beans>

But I want to configure JNDI DataSource in Tomcat and use it.

解决方案

The reason was that, I missed factory="org.apache.tomcat.jdbc.pool.DataSourceFactory". Right definition of resource must be

  <GlobalNamingResources>
    <Resource name="jdbc/ApsuserAtAzistst"
              auth="Container"
              type="javax.sql.DataSource"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@10.0.153.10:1525:AZISTST"
              username="APSUSER"
              password="PASSWORDOFAPSUSER"
              initialSize="1"
              minIdle="1"
              maxIdle="1"
              maxActive="3"
              maxWait="1000"
              validationQuery="select 1 from dual"
              jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=1500)"
            />
  </GlobalNamingResources>

这篇关于无法在春季使用Tomcat提供的JNDI数据源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆