ORACLE OCI的no ocijdbc10 in java.library.path及ORA-00932:inconsistent datatype解决之道

出错了:Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0" java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path
 at java.lang.ClassLoader.loadLibrary(Unknown Source)
 at java.lang.Runtime.loadLibrary0(Unknown Source)
 at java.lang.System.loadLibrary(Unknown Source)
 at oracle.jdbc.driver.T2CConnection$1.run(T2CConnection.java:3147)
 at java.security.AccessController.doPrivileged(Native Method)
 at oracle.jdbc.driver.T2CConnection.loadNativeLibrary(T2CConnection.java:3143)
 at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:221)
 at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:441)
 at oracle.jdbc.driver.T2CConnection.(T2CConnection.java:132)
 at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:78)
 at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
 at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
 at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
 at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
 at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
 at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
 at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
 at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
 at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

。。。。。。。

出错了:org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.co
mmon.jdbc.exception.NestedSQLException:  
--- The error occurred in com/eshore/idep/schedule/dao/po/ThreadControl.xml. 
--- The error occurred while applying a parameter map. 
--- Check the selectThreadControl-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: ORA-00932: inconsistent datatypes: expected %s got %s

。。。。。。。

为什么?怎么解决?请继续...

 

声明:下面的问题以ORACLE10g为参考版本(同样适用于ORACLE11g),因为在ORACLE9i中基本上是不会出现这些信息的,只要我们遵照通用的原则(自行google吧),但我们若以此文为参考,完全适应!

 

插序:关于JDBC Driver for ORACLE详细信息可参考http://redsnow-fenglin.iteye.com/blog/520618,我们常用的驱动应该的应该是第3、4类和第2类的OCI,据传OCI的性能优于THIN,但并未看到有力的证明,而且经个人测试也未必如此,参见我的帖子:

写道
http://www.iteye.com/topic/242902?page=11#1163693
PS:之说以这么说是因为我最近做了一个纯后台的项目时遇到持久层的性能瓶颈争论问题,我给大家一个粗略的性能测试数据,即便我不说,相信大家横行对比也知道这里面的含义了(据说C的oracle oci可以到达3k条/秒的insert速度,而我测java的oci或thin最好测试记录也无非1.3k多条/秒,比较汗):
测试环境:主机 HP-UX rp3440 B.11.23 U 9000/800 (td) 数据库 ora9i
插入速度测试数据
模式 驱动模式 数据量 2w 2w 10w 10w
原始jdbc模式 thin 时间(速率) 17秒(1176条/秒) 18秒(1111条/秒) 1.26分(1162条/秒 1.26分(1162条/秒)
oci 18秒(1111条/秒) 18秒(1111条/秒) 1.25分(1176条/秒 1.28分(1136条/秒)
JdbcTemplate模式 thin 24秒(833条/秒) 24秒(833条/秒) 1.59分(840条/秒) 1.54分(877条/秒)
oci 29秒(689条/秒) 29秒(689条/秒) 2.33分(653条/秒) 2.21分(709条/秒)

 其实,开发中最常见的就是ORACLE的THIN模式,但为何我这里提出这个OCI模式呢?这是因为经过多方查资料显示在使用ORACLE的RAC模式时,推荐OCI模式~~

 

其实OCI模式使用起来配置也是蛮简单的,但可能种种原因,我们会遇到种种预期不到的问题,这里我给出一些注意事项:

 

解决之道:

写道
1、采用OCI的server必须有作为客户端访问ORACLE的能力;

2、OCI的jdbcURL有两种配置风格:简略模式和详尽模式,建议采用简略模式,尤其是在我们使用ORACLE的RAC功能时,两种模式的样例如下:

A. 简略模式 jdbc:oracle:oci:@x_tnsname,其中x_tnsname是您配置在$ORACLE_HOME/.../network/admin/tnsname.ora中的标示符

B. 详尽模式 jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x_ip)(PORT=x_port)))(CONNECT_DATA=(SERVICE_NAME=x_sid)(SERVER=DEDICATED))),其中x_ip、x_port、x_sid是对应oracle的相应配置

3、ORACLE JDBC DRIVER驱动版本 在ORACLE 的 THIN模式我曾说过:
写道
http://redsnow-fenglin.iteye.com/blog/526192
原以为最好的方法是用oracle版本一致的驱动版本,但经过多次测试发现,采用高版本的JDBC DRIVER报错的时间会向后推迟久点(10.2.0.1大约1天多后,10.2.0.4大意两天左右),
 
但它并不单纯适应于OCI模式,因为OCI模式与本地动态库有关联,一般情况下,推荐使用和我们ORACLE数据库版本一致的驱动JAR及动态库,这些都可以在我们的ORACLE安装目录下找到,当然,我们也可以采用高版本的驱动JAR及相应的动态库,但是,我们绝对不可以采用版本不一致的驱动JAR及相应的动态库,否则,那就会有Cause: java.sql.SQLException: ORA-00932: inconsistent datatypes: expected %s got %s之类的异常

4、libocijdbc.so 这个家伙是关键,也许我们google说只要将ORACLE相应的这个家伙放入libpath就ok,比如LD_LIBRARY_PATH=/data/ora10g/10.2.0.1/product/lib32:/lib:/data/ora10g/code/ace-5.5/ace,但很不幸,即便如此,我们依旧可能收到java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path
,至少我们在IBM AIX5.3上(因我们的HP-UX是ORACLE9i的,没必要理会这个,一切OK),那么,它的解决之道就是用-Djava.library.path强制导入我们ORACLE相应的这个动态库(分lib32、lib(64的),根据需要自行选择);

 按照上面的4点,ORACLE OCI模式无忧矣。

 

导致两个异常的元凶:

A.解决之道4中没用-Djava.library.path强制导入我们ORACLE相应的这个动态库(在IBM AIX5.3) 引起异常

 java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path

B.解决之道4中没有保持版本一致的JDBC DRIVER及相应的OCI所需本地动态库引起异常

 java.sql.SQLException: ORA-00932: inconsistent datatypes

 

 

 问题已解决,希望对同僚们有所帮助~~

你可能感兴趣的:(DATABASE)