簡體   English   中英

SQLException:oracle 中的協議沖突

[英]SQLException: Protocol Violation in oracle

我收到“違反協議”的消息。 我有一個在 RedHat Linux 上運行的應用程序。數據庫和應用程序共同駐留在機器上。

使用的 Oracle 版本:Oracle 11g R2 (11.2.0.3.0)
使用的 JDBC 驅動程序:12.1.0.1
使用的Java:jdk1.7.0.65 32位

我遇到過很多論壇,其中有人指出此錯誤是驅動程序問題,但在所有這些論壇中,使用的 oracle 版本更高,驅動程序版本較舊,更改驅動程序解決了問題。但就我而言,Oracle 版本較低,但驅動程序版本較高。那么,在這種情況下,驅動程序的較高版本會出現問題嗎?

此外,當達到 DB 上的最大連接數時,也會出現這種違反協議的情況?

錯誤信息:

java.sql.SQLException:協議違規:[72] at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:464) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTTIfun.java:192) at oracle.jdbc .driver.T4C8Oall.doOALL(T4C8Oall.java:531) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement)oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) at or .jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628) at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)

增加堆空間!

我隨機出現了這個確切的錯誤。

應用程序內存不足,由於代碼中的邏輯導致拋出無關的異常,因此 OutOfMemory 錯誤丟失。

應用程序不應處理 throwables 和錯誤的原因之一。

此類錯誤表明 JDBC 瘦驅動程序中存在錯誤,該錯誤無法理解服務器在線路(套接字)上返回的內容。

您可以隨時嘗試使用最新的 JDBC 瘦驅動程序,希望該錯誤能夠得到解決。 截至今天,最新版本是 12.1.0.2。

如果這沒有幫助,那么您需要聯系 Oracle 支持。 您將被要求的第一件事是提供發生此錯誤的連接的 sqlnet 跟蹤。 這將有助於 Oracle 工程師了解故障發生時網絡上發生的情況。

要打開 sqlnet 跟蹤,請編輯服務器上的 sqlnet.ora 文件並添加

TRACE_LEVEL_SERVER = 16

這將為跟蹤目錄中的每個連接添加一個跟蹤文件(在服務器上)。 不要在生產系統上執行此操作,因為它會顯着降低系統速度並生成大量痕跡。

祝你好運。

就我而言,使用 PreparedStatement 的 getGeneratedKeys() 獲取當前序列值會導致協議違規異常。 將其替換為從序列中獲取序列當前值,如下所示:

String curSeqValQuery = "SELECT seq_name.CURRVAL FROM DUAL";
...
statement = con.prepareStatement(curSeqValQuery);
resultSet = (OracleResultSet) statement.executeQuery();
...

解決了這個問題。

ojdbc7.jar 中已修復的問題 - 版本 12.1.0.2(版本可以在 jar 的 META-INF 文件中檢查)

這通常表示損壞的 tcp/ip 流量。 這可能是由於注入的流量或丟棄的數據包造成的。 執行ifconfig以查看您的任何網絡接口是否受到異常大量丟棄數據包的影響。 為避免出現問題,當您指出數據庫和 java 程序在同一台機器上運行時,請嘗試使用環回接口 127.0.0.1(本地主機),而不是使用外部 IP 連接到數據庫,或者相反僅用於一個測試。

沒有進一步研究這一點,但我想當驅動程序和數據庫版本相距太遠時也可能發生這種情況。 讓驅動程序與安裝的 oracle 相匹配應該不會太困難。

可能只是連接被感染或無效。 如果您的 JDBC 連接來自連接池,請始終確保在保留時測試連接。

在我的情況下,這發生在我們嘗試使用 ojdbc 驅動程序從另一個數據源定位 db 鏈接提取數據時,我們沒有連接到直接數據源。 一旦我們通過直接連接而不是使用 db link 進行連接,問題就會停止出現。
我注意到的另一件事是,當我們嘗試從具有中文/日文字符的列中提取數據時,問題以一致的方式發生。
最后,分塊提取數據也是一個合適的解決方案。
HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM