Oracle JDBC驱动程序未使用旧版Web应用程序中的JNDI连接到数据库

时间:2013-12-12 17:23:25

标签: java oracle tomcat netbeans jdbc

不是Java专家 - 实际上,正在处理将导致新项目的遗留项目。也就是说,目前正在尝试创建旧项目并连接到测试数据库。我可以通过Netbeans Services面板或通过SQLDeveloper直接连接。

正在使用的服务器目前是Apache Tomcat 7.0.42。

Oracle JDBC驱动程序是ojdbc7.jar - 我知道,很老,但是为了通过这个文件获得连接,它包含在源代码中。

Java平台是JDK 1.7,虽然这是我的Netbeans副本的默认设置 - 再次,这是一个非常古老的项目,我相信它使用的是DTD Web应用程序2.3,所以我甚至可能使用错误的JDK编译,尽管我只看到我应该能够忽略的折旧和限制警告(它们似乎更多地存在于源包中,而不是在项目的这个方面。)

项目本身应该一直在运行 - 我通过版本控制将其拉下来。

由于源代码不包含JNDI的实际配置,我不得不做我的研究(用于常规MySQL数据库连接;这个JNDI世界对我来说是全新的。) - 我最终找到了以下内容建议修改server.xml(在Tomcat上)和context.xml(在web应用程序中)的链接。 http://www.microdeveloper.com/html/JNDI_Orcl_Tomcat1p.html - 尽管如此,我不确定这是否是开始配置数据源的正确方法。

SERVER.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"
 />

context.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>

我不确定我是否正确使用type,auth或factory(也必须从上面的链接更改driverClassName) - 当我在NetBeans中测试连接时,oracle.jdbc.OracleDriver列出的属性为驱动程序名字。)为了进一步让我感到困惑,我不确定我理解为什么网址在// @或@服务如何工作之后仍然包含@但这只需要我的研究结果。我应该打的模式叫做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 个答案:

答案 0 :(得分:0)

原来这是一个IDE问题 - 如上所述,JDBC驱动程序没有传递给服务器。我最终关闭了服务器并关闭了Netbeans - 从那里我启动了Eclipse并在不同的Tomcat实例中测试了应用程序 - 服务器启动都很好。关闭它然后回到Netbeans;服务器正在运行。

IDEProblems