采用OCI方式访问Oracle时出现UnsatisfiedLinkError错误

    经过我们夜以继日又日以继夜的折腾,广东盐业的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点,累得我呀,眼睛都绿了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值