我想在基于Spring的应用程序中使用Tomcat提供的JNDI DataSource。我使用Tomcat 7池。
Tomcat的配置的server.xml:
<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>
创建了具有以下内容的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"> <property name="jndiName" value="java:comp/env/jdbc/ApsuserAtAzistst"/> </bean> </beans>
运行应用程序时收到错误消息:
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)
当我将applicationContext.xml更改为:一切正常
<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>
但是我想在Tomcat中配置JNDI数据源并使用它。
原因是,我错过了factory =“ org.apache.tomcat.jdbc.pool.DataSourceFactory”。正确定义资源
<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>