【发布时间】:2020-03-06 10:44:04
【问题描述】:
使我的应用程序支持 Spring 后,JDBC JNDI 查找开始在我的应用程序上失败。
- tomcat 上的 JDBC 数据源设置与非 Spring 一样正确 应用程序能够连接相同的设置。
- 尝试在应用程序的 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>
- 还尝试在应用程序的 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>
- 自从发布了这个帖子,还在 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。在您的命名空间示例中,您已切换id和jndi-name属性。 -
@M.Deinum - 我对这个建议感到困惑。您能详细说明我需要更改的地方吗?
-
要么。
jee:jndi-lookup基本上是JndiTemplate的一个很好的包装。 -
啊!那是一个错字。对我来说,bean 声明或 jee:jndi 都为数据源返回 NULL。
-
他们不应该返回
null,而是阻止你的应用程序启动。另外,您为什么要进行手动查找而不是使用 Spring 定义的查找?