gpt4 book ai didi

java - 为什么 JNDI 返回一个带有 NULL uri 的数据源而不是查找失败?

转载 作者:行者123 更新时间:2023-11-30 06:36:11 24 4
gpt4 key购买 nike

我找了一个类似的问题,但只找到类似的问题,例如Godaddy JNDI Problem---Cannot create JDBC driver of class '' for connect URL 'null'这没有回答我的一般问题。

Tomcat 7.0.8 ..下面的代码

Context initialContext = new InitialContext();
datasource = (DataSource) initialContext.lookup("java:comp/env/" + "blah");
Connection c = null;
c = datasource.getConnection();

抛出这个错误。

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
...
Caused by: java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:527)
at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:496)
at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:319)
at java.sql.DriverManager.getDriver(DriverManager.java:386)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 24 more

我不是在问它为什么失败或如何修复它。

我的问题是,为什么 LOOKUP 没有失败?

为什么 lookup 创建了一个无用的 BasicDataSource 和一个空 URL?有没有比尝试使用它并查看它是否爆炸更好的方法来检测 JNDI 名称是否“不存在”?这种方法让我想起了 how they test bridges .

我终于硬着头皮将一堆代码从原始 JDBC 代码移到 JNDI,但许多谜团仍然存在。

如果可能,我想避免向下转换 BasicDataSource,以至少保持数据库独立性的错觉。

TIA

最佳答案

据我了解,JNDI 是为了保留对对象 对象工厂 的引用。

对象 业务很简单 - 配置器提供对对象的引用,应用程序使用它,就这么简单。但对于更复杂或更一般的情况,提供对对象工厂的引用会更方便,这样可以更自由地创建对象。

因为你还没有发布你的 webapp 的 web.xml 和 Tomcat 的 conf/server.xml,所以很难详细说明,但我想你有类似的东西在你的 web.xml 中

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

如果您阅读 Tomcat's JNDI howto ,你应该看到这个:

Providing that Tomcat is able to identify an appropriate resource factory to use to create the resource and that no further configuration information is required, Tomcat will use the information in /WEB-INF/web.xml to create the resource.

现在,让我们看看Tomcat's implementation of the above .在第 112 行,您可以看到如果给定的 res-type 等于 javax.sql.DataSource,它使用 org.apache.tomcat.dbcp.dbcp。 BasicDataSourceFactory 创建一个新的数据源。

就是这样。至此,JNDI 的工作结束了,因为它对对象的创建方式没有影响——这是理所当然的!不要忘记 JNDI 旨在存储对任何类型对象(邮件连接、安全领域等)的引用。为每种不同类型的对象编写测试既不可能也不合理。即便如此,仅通过数据库设置也无法确定这些设置是否足以与真实数据库建立实时连接。

这就是为什么你有一个单独的调用,datasource.getConnection(),这就是它抛出你应该捕获和处理的 SQLException 的原因。

附注您可能会争辩说 BasicDataSourceFactory 应该更聪明并且有一个强制属性/参数列表。或许。但这是另一个问题的主题,因为最初您问过为什么 LOOKUP 没有失败 ;)

关于java - 为什么 JNDI 返回一个带有 NULL uri 的数据源而不是查找失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com