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();