java.sql.SQLException: Protocol violation 问题解析

问题描述:
Hibernate 4.0.2
Spring 3.2.3
ojdbc6
oracle使用的是 10.0.2版本


系统偶尔会出现以下错误:


java.sql.SQLException: Protocol violation: [1]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:527)


网络搜索了一下, 基本上认为是ojdbc的版本不对导致, 回退一下ojdbc, 使用ojdbc14版本。
好像以上状况是不会出现了, 但是在处理Blog字段是会报如下错误:


java.lang.AbstractMethodError
at org.apache.commons.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)
 
查了一下,原因还是和数据库相关。
JDBC库往数据库写入blob字段值的吧,blob字段写入的时候不能直接写在insert语句里,insert的时候blob字段要配个empty_blob()替代,然后在修改刚刚写入的数据,通过二进制流写入blob字段值。


看一下 Oracel JDBC驱动的历史


1. 随Oracle 8i发布的Oracle JDBC驱动8.1.7版本
classes111.zip 适用于JDK 1.1.x
classes12.zip  适用于JDK 1.2.x
只有zip文件,无jar文件。




2. 随Oracle 9i发布的Oracle JDBC驱动9.2.0版本
classes111.jar  适用于JDK 1.1.x
classes12.jar   适用于JDK 1.2 and JDK 1.3 (我的项目环境JDK1.6,oracle 10g,windows,用了这个目前没发现问题)
ojdbc14.jar     适用于JDK 1.4
classes111.zip  适用于JDK 1.1.x
classes12.zip   适用于JDK 1.2.x


3. 随Oracle 10.2发布的Oracle JDBC驱动10.2版
classes12.jar  适用于JDK 1.2 and JDK 1.3. 
ojdbc14.jar    适用于 JDK 1.4 and 5.0


4.随Oracle 11.1发布的Oracle JDBC驱动11.1版本
ojdbc5.jar:   适用于jdk5
ojdbc6.jar:   适用于jdk6 (如果你使用jdk1.5,就不能使用这个驱动)


汇总一下:
Oracle版本
jdk版本
推荐jar包
备注
Oracle 8i
JDK 1.1.x
classes111.zip
 
Oracle 8i
JDK 1.1.x
classes12.zip
 
Oracle 9i
JDK 1.1.x
classes111.jar或者 classes111.zip
 
Oracle 9i
JDK 1.2 and JDK 1.3
classes12.jar 或者 classes12.zip
 
Oracle 9i
JDK 1.4
ojdbc14.jar
 
Oracle 9i
JDK 1.5
ojdbc5.jar
 
Oracle 9i
JDK 1.6
ojdbc6.jar
 
Oracle 10g
JDK 1.2 and JDK 1.3.
classes12.jar
 
Oracle 10g
JDK 1.4 and 5.0
ojdbc14.jar
 
Oracle 11g
jdk5
ojdbc5.jar
 
Oracle 11g
jdk6
ojdbc6.jar






看起来要解决这个问题,只能是升级Oralce的版本了。




不过网络上还遇到一种状况就是在批量处理LONG型数据的时候也遇到过这种问题, 取消批量处理就正常了。批量代码段如下:
PreparedStatement ps = conn.prepareStatement(sql);  
ps.setString(1, xml);  
ps.executeUpdate(); 

你可能感兴趣的:(110-Java语言)