Oracle JDBC 驱动程序未在旧版 Web 应用程序中使用 JNDI 连接到数据库
Posted
技术标签:
【中文标题】Oracle JDBC 驱动程序未在旧版 Web 应用程序中使用 JNDI 连接到数据库【英文标题】:Oracle JDBC driver not connecting to database with JNDI in legacy web application 【发布时间】:2013-12-12 17:23:25 【问题描述】:不是 Java 专家 - 事实上,从事将导致新项目的遗留项目。也就是说,目前正在尝试创建旧项目并连接到测试数据库。我可以通过 Netbeans 服务面板或 SQLDeveloper 直接连接。
当前使用的服务器是 Apache Tomcat 7.0.42。
Oracle JDBC 驱动程序是 ojdbc7.jar - 我知道,很老,但是为了通过这个文件获得连接,源代码中包含了。
Java 平台是 JDK 1.7,虽然这是我的 Netbeans 副本的默认设置 - 再说一遍,这是一个非常古老的项目,我相信它使用的是 DTD Web Application 2.3,所以我什至可能使用错误的 JDK 进行编译,虽然我只看到了我应该能够忽略的折旧和受限警告(它们似乎更多地存在于源包中,而不是项目的这个方面。)
项目本身应该一直在工作 - 我通过版本控制将其拉下来。
由于源代码不包含 JNDI 的实际配置,我不得不做我的研究(过去只是常规的 mysql 数据库连接;这个 JNDI 世界对我来说是全新的。) - 我最终找到了以下内容建议修改 server.xml(在 Tomcat 上)和 context.xml(在 Web 应用程序上)的链接。 http://www.microdeveloper.com/html/JNDI_Orcl_Tomcat1p.html - 尽管如此,我不确定这是否是开始配置数据源的正确方法。
服务器.XML
<Resource name="jdbc/travel"
aunt="Container"
type="oracle.jdbc.pool.OracleDataSource"
driverClassName="oracle.jdbc.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
url="jdbc:oracle:thin:@//dbname.host.com:1521/servicename.host.com"
user="travel"
password="password"
maxActive="20"
maxIdle="10"
maxWait="-1"
/>
上下文.xml
<ResourceLink global="jdbc/travel" name="jdbc/travel" type="oracle.jdbc.pool.OracleDataSource"/>
Web.xml(不确定是否需要)
<resource-ref>
<description>Travel</description>
<res-ref-name>jdbc/travel</res-ref-name>
<res-type>oracle.jdbc.pool.OracleDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
我不确定我是否正确使用了类型、身份验证或工厂(还必须从上面的链接更改 driverClassName - 当我在 NetBeans 中测试连接时,将 oracle.jdbc.OracleDriver 列为驱动程序的属性名称。)为了进一步混淆,我不确定我是否理解为什么 url 在 @ 之后包含 // 或服务如何工作 - 但这只需要我做更多的研究。我应该使用的架构称为 travel(用户名也是如此)。
我不一定包含实际启动连接的类,因为它们很长并且调用许多其他类(不同的数据库取决于配置、不同的工具、架构、表等)我可以包含该方法但是,在我的 Jdbc 类中(省略了 log4j 内容):
private transient Connection conn ;
private transient ResultSet rs ;
private transient Statement stmt ;
private transient Context initContext = null;
private DataSource ds = null;
private String jndiName = null;
public Jdbc( )
super ( ) ;
;
public Jdbc( final String _jdniName ) throws TravelException , InstantiationException , IllegalAccessException , ClassNotFoundException
super ( ) ;
this.jndiName = _jdniName;
public void connectToDatabase( ) throws TravelException
try
this.disconnectFromDatabase ( ) ;
if (this.ds==null)
this.initContext = new InitialContext();
Context envCtx = (Context) initContext.lookup("java:comp/env");
this.ds = (DataSource) envCtx.lookup(this.jndiName);
this.conn = this.ds.getConnection ( );
catch ( final Exception e )
this.conn=null ;
throw new TravelException ( e ) ;
...
我不确定是环境导致问题还是我的 XML 配置 - 我一直遇到的错误是:
java.sql.SQLException: Io exception: Message file 'oracle.net.mesg.Message' is missing.
这似乎指向一个根本没有被报告的问题 - 我假设它实际上并没有连接到服务器。
如果需要更多详细信息,我很乐意提供我所能提供的 - 如果这类问题不符合 Stack Overflow M.O. 的要求,我深表歉意 - 尽我所能!
总结一下我的问题 - 我无法通过我的代码连接到 Oracle 10g 数据库,但是,我可以使用 SQLDeveloper 或 Netbeans 中的“服务”面板使用相同的 URL 和登录信息直接连接 - 我相信我的问题在于我对 Web 应用程序 XML 的配置,但我不确定我哪里出错了。即使我不再将 oracle jar 包含在我的编译时库中,我似乎也确实收到了相同的错误消息,这很奇怪,因为当它被包含时,我可以在 IDE 的 Library 文件夹中看到该 jar - 奇怪在我的 Tomcat 文件夹中足够了,它无处可寻。也许问题是驱动程序没有被正确包含?
【问题讨论】:
【参考方案1】:原来这是一个 IDE 问题 - 如上所述,JDBC 驱动程序没有被传递到服务器。我最终彻底关闭了服务器并关闭了 Netbeans - 从那里我启动了 Eclipse 并在另一个 Tomcat 实例中测试了应用程序 - 服务器启动得很好。关闭它并移回Netbeans;服务器正在工作。
IDE 问题
【讨论】:
以上是关于Oracle JDBC 驱动程序未在旧版 Web 应用程序中使用 JNDI 连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章
在旧版 MySQL 驱动程序中插入 BLOB 会导致“消失”错误
我的反应应用程序没有在旧版 Safari 浏览器上加载图像和某些组件。显示 SSL 错误