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 会导致“消失”错误

在旧版 Win32 应用程序中实现 COM 事件接收器

Chrome Rich 通知在旧版打包应用程序中不起作用

我的反应应用程序没有在旧版 Safari 浏览器上加载图像和某些组件。显示 SSL 错误

如何在旧版 IOS/旧版浏览器上使用 Graphql Vue Apollo?

旧版应用程序中的 VUE Web 组件导致错误“_Ctor,对象不可扩展”