【问题标题】:How to use JNDI DataSource provided by Tomcat 7 in Spring?Spring如何使用Tomcat 7提供的JNDI DataSource?
【发布时间】:2015-03-18 13:33:05
【问题描述】:

我关注了这个答案How to use JNDI DataSource provided by Tomcat in Spring?,但我遇到了以下异常:

java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:524)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:493)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
at java.sql.DriverManager.getDriver(DriverManager.java:273)
at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:224)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:120)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:143)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:132)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

tomcat server.xml:

<GlobalNamingResources>
<Resource 
    name="jdbc/welcome-kit"
    global="jdbc/welcome-kit"       
    auth="Container" 
    type="javax.sql.DataSource" 
    username="name" 
    password="pass" 
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="host/port:test" 
    maxActive="8" 
    maxIdle="4"
/>

tomcat 上下文.xml

<ResourceLink global="jdbc/welcome-kit" name="jdbc/welcome-kit" type="javax.sql.DataSource" />

Web 应用程序 web.xml:

<resource-ref>
 <description>DB Connection</description>
 <res-ref-name>jdbc/welcome-kit</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>

spring-context.xml:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/welcome-kit">
</bean>

我还在 tomcat/lib 中添加了 ojdbc.jar

【问题讨论】:

  • 也许你应该添加你的配置文件?

标签: java spring tomcat datasource jndi


【解决方案1】:

在 web.xml 中

<resource-ref>
    <res-ref-name>myDatasource</res-ref-name>
    <res-type>javax.sql.XADataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在您的 Spring 应用程序上下文中:

<!-- Define the JNDI datasource -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/myDatasource" />
</bean>

【讨论】:

  • 当你在全局命名空间中声明数据源时,你必须使用java:/jdbc/welcome-kit来解析它
  • 出现其他错误原因:javax.naming.NameNotFoundException: Name [jdbc/welcome-kit] is not bound in this Context.
  • hmm 所以以前的 JNDI 名称是正确的,并且您的错误与 JNDI 查找无关。似乎使用的驱动程序是一个 jdbc-odbc 桥,而您在数据源声明中指定了一个 oracle JDBC 驱动程序类。尝试下载并提供合适的驱动程序(oracle.com/technetwork/database/features/jdbc/index-091264.html
猜你喜欢
  • 2012-02-29
  • 2016-05-01
  • 2014-04-24
  • 2015-09-11
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多