2011-01-13 119 views
8

我收到以下錯誤時拋出:SQLException:違反協議。甲骨文JDBC驅動程序問題

java.sql.SQLException: Protocol violation 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:286) 
at oracle.jdbc.driver.T4C80all.receive(T4C80all.java:766) 
at oracle.jdbc.driver.T4CPreparedStatement.do0all8(T4CPreparedStatement.java:216) 
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1225) 
at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:373) 
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:284) 

Oracle系統在Solaris 5.10運行10.2.0.3.0。 jdbc驅動程序在JDK 1.6.0_21上運行(如果它導入,java也在Solaris 5.10機器上運行)。我已經嘗試了幾種不同的oracle瘦驅動程序,包括最新的和看起來與oracle版本完全匹配的驅動程序。

我正在運行的查詢很簡單:「select * from some_table order by key1,key2,key3」然後遍歷結果集並寫入文件。該桌有大約1200萬行,所以我預計這個過程會持續很長時間,但似乎在5-15分鐘內死亡。每次運行它時,它都會出現在不同的行上,所以我認爲問題不在於數據。

我發現了oracle警報日誌,但我不能說那裏有什麼和我的進程有關。儘管如此,我不是Oracle專家,也許我需要看一下oracle的設置。奇怪的是,我在不同的連接上運行了大約五種類型的查詢(一對更復雜一些),只有兩個最簡單的查詢會遇到這個問題。

任何關於如何縮小問題的幫助或想法,將不勝感激。

+0

也許你的數據庫服務器上運行的內存?你是否正確地關閉了Java中的資源?這是發生在你的系列中的第一個查詢運行還是後來的一個? – Riggy 2011-01-13 21:24:21

回答

6

顯然,在java命令行中添加-d64可修復此問題。看起來像Solaris 64位問題。

+2

對我來說,升級我的ojdbc驅動程序解決了這個問題。我跳到11.2.0.2.0,一切都很好。 – Muel 2013-10-29 03:56:42

5

對於未來需要此頁面的Google員工而言,這裏是我們遇到的問題。 應用程序日誌和Oracle跟蹤記錄了協議違規異常。

Oracle跟蹤

這是Oracle跟蹤文件錯誤

---協議違規DETECTED ---

----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 --- 
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) ----- 
     select xyz 

從應用程序日誌

Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000]; 

症狀

偶爾會發生此異常。堆棧跟蹤有不同的SQL,這是非常混亂。用sql plus運行sql運行良好。

根源

當Oracle司機企圖導出CLOB數據的異常被拋出。這隻發生在少數記錄上,而不是全部。數據本身就是一個文件。在視覺上,我們無法弄清楚這些數據有什麼問題。

爲什麼我們在oracle日誌中看到錯誤?

所以如果這是一個驅動程序缺陷,爲什麼我們看到oracle跟蹤中的錯誤?邏輯上,驅動程序錯誤應該僅限於應用程序日誌。 原因是當協議違規發生時,連接被破壞。該連接已返回到連接池。任何用戶或工作何時使用該連接都不起作用,並且會遇到錯誤。 這就是爲什麼它會發生在隨機的地方,隨機用戶

解決方案

短期固定在連接池來改變這種屬性。我們正在使用DBCP連接池。

從 改變ds.setTestOnBorrow(false); 至 ds.setTestOnBorrow(true);

現在,當應用程序借用此連接之前,池向池返回損壞的連接時,它將測試其有效性。如果連接不可用,池將丟棄,然後應用程序獲得新的/有效的連接。

如果啓用連接池日誌,則應該看到通常被吞下的異常。

,驅動程序從OJDBC 12.1.0.1升級

升級到OJDBC 12.1.0.2解決了這個問題,即使有問題的行。

其他一些鏈接以供參考

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used