采用OCI方式访问Oracle时出现UnsatisfiedLinkError错误
2005-11-12 01:49
363 查看
经过我们夜以继日又日以继夜的折腾,广东盐业的Oracle问题终于搞定,在此多谢各位的支持啦! :-)
现将问题现象和解决过程做一总结,希望对大家有点帮助
1、首先说说硬件环境:
数据库服务器:AIX + Oracle9205 RAC(两台Oracle服务器做集群)
应用服务器: Win2003 + Oracle9206
NC+IUFO 从v3.0 升级到 v3.1
数据源配置使用oci方式(这一点至关重要)
<databaseUrl>jdbc:oracle:oci:@oradb</databaseUrl>
2、问题现象
升级过程中后台抛错:
2005-11-11 15:13:25 SO|java.lang.UnsatisfiedLinkError: blob_read
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.blob_read(Native Method)
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.blobRead(OCIDBAccess.java:2995)
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.lobRead(OCIDBAccess.java:2885)
2005-11-11 15:13:25 SO|at oracle.sql.LobDBAccessImpl.getBytes(LobDBAccessImpl.java:248)
3、处理过程(这部分可以略过)
3.1 方法:将数据和代码移到测试服务器(Oracle没有做集群,数据源采用jdbc:oracle:thin的形式),升级成功。
此时将升级后的数据库重新导入到正式系统,在使用某些功能点时出错,日志异常同上。
分析:由此怀疑为数据库的问题(此时我感觉oci肯定有问题,但是具体是什么问题,也说不好)
结果:失败!
3.2 方法:把数据库服务器的classes12.zip解压到nc_web下,重启中间件后,现象依旧!
分析:这个方法是集团经常推荐的方法,也是我最近经常用的,以前几乎是屡试不爽,但是这次还是不行,为什么呢?
结果:失败!
3.2 方法:看到newcentury/lib目录下有个ojdbc14.jar,怀疑我们的中间件用的是这个,把它删掉。重启后现象依旧!
分析:不知道如果我们的中间件优先选用lib目录下的jar包还是nc_web下的class。哪位牛人提示一下?
结果:失败!
3.3 方法:矛头对准jdbc:oracle:oci,试图使用jdbc:oracle:thin来替换之。结果中间件启动后报错,无法连接数据库。我晕!
分析:对Oracle RAC我是一窍不通,到现在也没搞明白如果不通过oci,怎么来搞这个连接。
结果:失败!
3.4 方法:重新看日志,突然发现UnsatisfiedLinkError这个异常好像很眼熟。
经过半个小时的冥思苦想,终于想起我在三年前学习jni的时候遇到过这个异常,
赶紧测试一下,发现如果在java中对本地方法的声明有错误,就会抛这个异常
可以肯定,oracle的类和本地的dll文件版本不一致,那么到底调用的是哪个dll呢?
反编译OCIDBAccess,加了一行输出,发现调用的是ocijdbc9.dll(记不清楚了,大概是这个)
于是,试图从数据库服务器找寻这个dll,可是没找到,郁闷!
分析:距离成功就差一步之遥了,坚持住!
结果:失败!
3.5 方法:这时候李魁扬大侠的一句话点醒了梦中人。大侠说,oci是要调用本地的oracle客户端来连接数据库的。
既然这样,那只要让中间件使用的jdbc版本和应用服务器的oracle客户端版本一致就可以了
于是乎,把应用服务器的classes12.zip解压到nc_web下,重启中间件测试,喜出望外,成功了!
分析:工夫不负有心人哪
结果:成功!
4、最终解决方法
把应用服务器的classes12.zip解压到nc_web下,重启中间件,问题解决!
5、总结
jdbc:oracle:thin和jdbc:oracle:oci两种方式的不同在于,前者是通过java直接访问数据库,而后者是通过本机的oracle客户端来访问数据库。
所以,对于前者,需要让中间件使用数据库服务器的jdbc;而对后者,需要让中间件使用本机的jdbc。
这时,我想到的一个问题是,为什么原来ncv3.0的时候用的好好的呢?
问过童超后有了答案,在v3.0期间应用服务器的oracle装的是9201,而我们中间件自带的正是这个版本的jdbc驱动。
到此,所有问题都已经清楚了,大功告成,终于可以吃饭了。从上午10点一直搞到下午6点,累得我呀,眼睛都绿了!
现将问题现象和解决过程做一总结,希望对大家有点帮助
1、首先说说硬件环境:
数据库服务器:AIX + Oracle9205 RAC(两台Oracle服务器做集群)
应用服务器: Win2003 + Oracle9206
NC+IUFO 从v3.0 升级到 v3.1
数据源配置使用oci方式(这一点至关重要)
<databaseUrl>jdbc:oracle:oci:@oradb</databaseUrl>
2、问题现象
升级过程中后台抛错:
2005-11-11 15:13:25 SO|java.lang.UnsatisfiedLinkError: blob_read
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.blob_read(Native Method)
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.blobRead(OCIDBAccess.java:2995)
2005-11-11 15:13:25 SO|at oracle.jdbc.oci8.OCIDBAccess.lobRead(OCIDBAccess.java:2885)
2005-11-11 15:13:25 SO|at oracle.sql.LobDBAccessImpl.getBytes(LobDBAccessImpl.java:248)
3、处理过程(这部分可以略过)
3.1 方法:将数据和代码移到测试服务器(Oracle没有做集群,数据源采用jdbc:oracle:thin的形式),升级成功。
此时将升级后的数据库重新导入到正式系统,在使用某些功能点时出错,日志异常同上。
分析:由此怀疑为数据库的问题(此时我感觉oci肯定有问题,但是具体是什么问题,也说不好)
结果:失败!
3.2 方法:把数据库服务器的classes12.zip解压到nc_web下,重启中间件后,现象依旧!
分析:这个方法是集团经常推荐的方法,也是我最近经常用的,以前几乎是屡试不爽,但是这次还是不行,为什么呢?
结果:失败!
3.2 方法:看到newcentury/lib目录下有个ojdbc14.jar,怀疑我们的中间件用的是这个,把它删掉。重启后现象依旧!
分析:不知道如果我们的中间件优先选用lib目录下的jar包还是nc_web下的class。哪位牛人提示一下?
结果:失败!
3.3 方法:矛头对准jdbc:oracle:oci,试图使用jdbc:oracle:thin来替换之。结果中间件启动后报错,无法连接数据库。我晕!
分析:对Oracle RAC我是一窍不通,到现在也没搞明白如果不通过oci,怎么来搞这个连接。
结果:失败!
3.4 方法:重新看日志,突然发现UnsatisfiedLinkError这个异常好像很眼熟。
经过半个小时的冥思苦想,终于想起我在三年前学习jni的时候遇到过这个异常,
赶紧测试一下,发现如果在java中对本地方法的声明有错误,就会抛这个异常
可以肯定,oracle的类和本地的dll文件版本不一致,那么到底调用的是哪个dll呢?
反编译OCIDBAccess,加了一行输出,发现调用的是ocijdbc9.dll(记不清楚了,大概是这个)
于是,试图从数据库服务器找寻这个dll,可是没找到,郁闷!
分析:距离成功就差一步之遥了,坚持住!
结果:失败!
3.5 方法:这时候李魁扬大侠的一句话点醒了梦中人。大侠说,oci是要调用本地的oracle客户端来连接数据库的。
既然这样,那只要让中间件使用的jdbc版本和应用服务器的oracle客户端版本一致就可以了
于是乎,把应用服务器的classes12.zip解压到nc_web下,重启中间件测试,喜出望外,成功了!
分析:工夫不负有心人哪
结果:成功!
4、最终解决方法
把应用服务器的classes12.zip解压到nc_web下,重启中间件,问题解决!
5、总结
jdbc:oracle:thin和jdbc:oracle:oci两种方式的不同在于,前者是通过java直接访问数据库,而后者是通过本机的oracle客户端来访问数据库。
所以,对于前者,需要让中间件使用数据库服务器的jdbc;而对后者,需要让中间件使用本机的jdbc。
这时,我想到的一个问题是,为什么原来ncv3.0的时候用的好好的呢?
问过童超后有了答案,在v3.0期间应用服务器的oracle装的是9201,而我们中间件自带的正是这个版本的jdbc驱动。
到此,所有问题都已经清楚了,大功告成,终于可以吃饭了。从上午10点一直搞到下午6点,累得我呀,眼睛都绿了!
相关文章推荐
- 用OCI方式联接oracle时出现 错误的解决方法。
- 创建oracle数据库时出现oracle快捷方式应用的项目无法访问,你可能没有适当的权限!帮忙解决什么问题啊!谢谢!
- 代码访问Oracle,出现ORA-01000超出打开游标的最大数 错误之解决方法
- java访问oracle的jdbc连接方式:oci和thin
- Oracle12c Client安装出现"[INS-30131]"错误“请确保当前用户具有访问临时位置所需的权限”解决办法之完整版
- 访问程序包 DBMS_APPLICATION_INFO 时出现错误 “SP2-0575: Oracle SQL 特征不位于 SQL92 Entry层。”
- Oracle问题 | 在安装Oracle11g时提示[INS-07003]在访问BeanStore时出现意外错误
- jdbc连接Oracle使用OCI方式产生EXCEPTION_ACCESS_VIOLATION 错误
- 安装Oracle 时 [INS-07003] 访问 BeanStore 时出现意外错误
- 首次远程安装 GlassFish 后以远程 Web 方式访问其后台管理系统出现错误的解决方法
- 尝试向 URI“ ”发出请求时出错。这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP 服务...。出现此错误也可能是由于使用的是 Web 服务代理中的内部类型而没有使用 InternalsVisibleToAttribute 属性。
- ODP安装完后,Oracle连接工具出现错误(Could not locate OCI dll)
- oracle 11g 安装好后 访问database control 出现证书错误 ?
- .Net 中访问Oracle 数据表,出现OCI-22053: overflow error
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管
- 安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
- eclipse配置tomcat,访问http://localhost:8080出现404错误
- 强制转换CSting为CHAR*时候出现错误的解决方式
- SQL2008:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
- Ubuntu16.04中出现错误, Epson Driver Install "Failed to satisfy all dependencies"的处理方式.