经过我们夜以继日又日以继夜的折腾,广东盐业的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点,累得我呀,眼睛都绿了!