当使用与ODI的JDBC驱动程序的时候出现如下错误"Connection failed", "Cannot connect", "No suitable driver", "Error during Session Preparation", "ClassNotFoundException" Or "NoClassDefFoundError"
适用于:
Oracle Data Integrator - Version: 4.1.01.05 and later [Release: 4.1.01 and later ]
此文档信息适用于任何平台。
***Checked for relevance on 26-APR-2010***
症状
在Oracle数据集成器(ODI)物理架构上创建一个数据服务器,使用”Microsoft JDBC Driver for SQL Server”(或其他)。
当测试连接到数据服务器,显示如下的信息:
Connection failed
com.sunopsis.sql.e: com.microsoft.jdbc.sqlserver.SQLServerDriver
原因
如下信息:
Connection failed
com.sunopsis.sql.d: <my JDBC driver Java class>
or
Cannot connect to ...
com.sunopsis.sql.SnpsUnknowDriverException: <my JDBC driver Java class>
or
com.sunopsis.sql.e: <my JDBC driver Java class>
at com.sunopsis.sql.SnpsConnection.c(SnpsConnection.java)
or
Error during Session Preparation: <my JDBC driver Java class>
at com.sunopsis.dwg.dbobj.SnpSession.remoteExecute(Unknown Source)
or
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager.java:532)
or
java.lang.NoClassDefFoundError: com/ncr/teradata/jtdgss/TdgssManager
or
java.lang.ClassNotFoundException: com/ncr/teradata/TeraDriver
are signaled by Oracle Data Integrator (ODI) to indicate that either:
Oracle 数据集成器(ODI)的信息表明:
指定的JDBC驱动程序在Java Classpath找不到(或者设置信息没有完全),或
在ODI的Metadata Navigator/LightWeight Designer的.jar或者.war文件没有正确安装,或
在Java处理过程中没有使用适当的ClassLoader将classes传入JVM虚拟机。
解决方案
这个问题可能有一个如下相关的情况:
1. Oracle数据集成器(ODI)代理没有使用”agentstop.bat(.sh)”脚本彻底停止,并且重新启动尝试使用新的JDBC驱动。
2. 测试或者使用连接时指定的JDBC驱动程序不可用或者是没有安装到机器上。
3. 指定的JDBC驱动程序没有在Oracle数据集成器(ODI)的Java路径:简单得copy全部构造驱动程序文件到ODI的”/drivers”文件夹,在机器上进行链接测试。
4. 指定的JDBC驱动程序是由几个文件组成的(Teradata, DB2 UDB...)并不是所有都被复制到ODI”/drivers”文件夹中。
5. 对于需要license的JDBC驱动程序,确保:
a) 你已经购买了它并且
b) 你已经把它复制到ODI”/drivers”文件夹了。
6. 指定的JDBC驱动程序或者包含输入的URL错误这不同于在Java path定义。
7. 在传输过程中指定的JDBC驱动程序已经损坏。如果它已经损坏你可以尝试 解压缩/打开它检查。
一些JDBC驱动程序在ODI的下拉列表中,但是不发往与ODI。
其他的JDBC驱动程序没有列出在ODI下拉列表中,但是如果他们已经安装在”/drivers”文件夹并且如果”JDBC Driver”和”JDBC URL”领域在连接窗口拥有正确的设置那么也可以使用ODI。
注意经常发生这种情况当有多个ODI安装在机器上并且JDBC驱动程序安装在一个装置中但是没有在装置中使用它。
可以单击右键设置使用快捷键并选择”属性”确认安装或者检查其他安装在ODI”/drivers”文件夹确保JDBC驱动程序安装避免任何混乱。
当使用代理启动Windows Service时,为了考虑账户JDBC驱动程序变化,服务可能需要卸载并且重新安装。请参阅Note.423712.1 <如何设置作为Windows Services的ODI代理?>
当使用Metadata Navigator或者LightWeight Designer时观察它的行为,然后请参阅ODI和应用服务器模块关于部署文件构成的驱动程序在”/WEB_INF/lib”目录的应用。
当使用技术文件的时候,卸载一个文件数据的步骤信息:
com.sunopsis.sql.c: com.sunopsis.jdbc.driver.file.FileDriver
这是由于实际上在”drivers”目录下不可能找不到JDBC驱动程序名为” com.sunopsis.jdbc.driver.file.FileDriver”的文件。
在ODI拓扑管理器>"Physical Architecture" tab > Technologies > File >使用上面步骤找到数据服务器文件,然后点击JDBC选项卡。
从”JDBC Driver”文件中,点击一下按钮,并在结果列表中,从技术文件上观察2个可用的JDBC驱动程序:
Sunopsis File JDBC Driver
Sunopsis File JDBC Driver (OLD)
从"Sunopsis File JDBC Driver"的com.sunopsis.jdbc.driver.file.FileDriver获得驱动程序的语法,这是目前ODI附带的驱动程序;JDBC驱动程序文件”snpsfile.jar”位于ODI的”drivers”目录上。
从"Sunopsis File JDBC Driver (OLD)"中获得com.sunopsis.jdbc.file.FileDriver的语法,并且使用向后兼容性针对当前客户升级ODI旧版本的Sunopsis,但是在它们的工作中仍然使用旧的JDBC驱动程序文件。
Intermittent:
java.lang.ClassNotFoundException: <my JDBC driver Java class>
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:130)
at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
在纯Java或者Jython代码行可能观察到的消息,当调用单个参数的”java.lang.Class.forName()”方法时,将类名加载到JVM中,例如:
import java.lang as lang
lang.Class.forName ('oracle.jdbc.driver.OracleDriver')
当明确设置ClassLoader在内部使用Java时同样的Java Class正确加载将进一步测试显示:
import java.lang as lang
lang.Class.forName ('oracle.jdbc.driver.OracleDriver', 1, lang.Thread.currentThread().getContextClassLoader())
在IBM AIX 64-bit操作系统已经发现这些问题,当32-bit Java5 SR7是用来运行多个,长期运行的线程。
The behavior is resolved using the 64-bit Java5 SR12 instead.
有关信息……
在内部,Java使用ClassLoader将classes加入到JVM中。
大多数时候,我们不需要知道任何有关于他们如何工作的(甚至是他们存在哪里)内容但是每一个Java类都是通过ClassLoader加载的。他的工作是通过java.lang.Class将它变成一个字节码。
大多数情况下,客户端应用程序(如作为ODI代理)不需要担心ClassLoader:它们将建立一个classpath并且它将是一个工程。
该贴被masy编辑于2011-12-26 13:16:38