【问题标题】:Tomcat JDBC datasource lookup failing in Spring appSpring 应用程序中的 Tomcat JDBC 数据源查找失败
【发布时间】:2020-03-06 10:44:04
【问题描述】:

使我的应用程序支持 Spring 后,JDBC JNDI 查找开始在我的应用程序上失败。

  1. tomcat 上的 JDBC 数据源设置与非 Spring 一样正确 应用程序能够连接相同的设置。
  2. 尝试在应用程序的 spring 配置中初始化 JNDIFactoryBean。
    <beans>
    <bean id="myDb" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="java:comp/env/jdbc/myDb"/>
      <property name="lookupOnStartup" value="true"/>
      <property name="proxyInterface" value="javax.sql.DataSource"/>
    </bean>
    </beans>
  1. 还尝试在应用程序的 web.xml 中添加资源引用。
 <resource-ref> 
  <res-ref-name>jdbc/myDb</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth> 
   <res-sharing-scope>Shareable</res-sharing-scope> 
  </resource-ref> 
 </web-app>
  1. 自从发布了这个帖子,还在 spring config.xml 中尝试了“jee:jndi-lookup”。
<jee:jndi-lookup expected-type="javax.sql.DataSource" id="myDb" jndi-name="java:comp/env/jdbc/myDb"/>

JDBC JNDI 数据源设置

CATALINA_HOME/conf/server.xml

<GlobalNamingResources>
    ......

    <Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxIdle="5" maxTotal="25" name="jdbc/myDb" password="ABDC" type="javax.sql.DataSource" url="jdbc:sqlserver://myServer:1233;databaseName=myDBdbdev" username="myUser"/>
  </GlobalNamingResources>

CATALINA_HOME/conf/context.xml

<context>
    <ResourceLink global="jdbc/myDb" name="jdbc/myDb" type="javax.sql.DataSource"/>
    ...

</context>

错误堆栈跟踪

javax.naming.NameNotFoundException:名称 [jdbc/myDb] 未绑定 这个上下文。找不到 [jdbc]。在 org.apache.naming.NamingContext.lookup(NamingContext.java:833) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:174) 在 org.apache.naming.SelectorContext.lookup(SelectorContext.java:163) 在 javax.naming.InitialContext.lookup(未知来源)在 com.abc.myapp.db.DataSourceFactory.createPool(DataSourceFactory.java:126) 在 com.abc.myapp.db.DataSourceFactory.init(DataSourceFactory.jav

获取数据源的代码

InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/myDb");

【问题讨论】:

  • 尝试将 jdbc/myDb 作为 jndi 名称并尝试将 resourceRef 设置为 true 。在您的命名空间示例中,您已切换 idjndi-name 属性。
  • @M.Deinum - 我对这个建议感到困惑。您能详细说明我需要更改的地方吗?
  • 要么。 jee:jndi-lookup 基本上是 JndiTemplate 的一个很好的包装。
  • 啊!那是一个错字。对我来说,bean 声明或 jee:jndi 都为数据源返回 NULL。
  • 他们不应该返回null,而是阻止你的应用程序启动。另外,您为什么要进行手动查找而不是使用 Spring 定义的查找?

标签: spring tomcat


【解决方案1】:

我刚刚发现以下代码有助于正确获取数据源:

InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myDb")

【讨论】:

  • 仍然没有使用 Spring。那么到底为什么要在 Spring 中配置它呢?不要进行查找,而是让 Spring 注入依赖项......基本上你已经配置了 spring(我怀疑是正确的)但这完全绕过了所有这些。
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2014-02-03
  • 2011-02-08
  • 2014-05-12
  • 1970-01-01
  • 2016-12-23
  • 2019-09-07
相关资源
最近更新 更多