2015-03-31 204 views
3

我收到「協議違規」。 我有一個在RedHat Linux上運行的應用程序。數據庫和應用程序共同駐留在機器上。SQLException:在oracle中違反協議

使用

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

我所遇到的許多論壇這個錯誤已被指出是一個驅動程序問題,但在所有這些論壇中使用的oracle版本較高,驅動程序版本較舊,並且更改驅動程序可以解決問題。但在我的情況下,Oracle版本較低,但驅動程序版本爲那麼,在這種情況下,更高版本的驅動程序可能會成爲問題?

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

錯誤消息:

java.sql.SQLException中:協議違反:[72]在 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:464) 在oracle.jdbc.driver .T4CTTIfun.doRPC(T4CTTIfun.java:192) 在oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 在oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) 甲骨文.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884) at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.j AVA:1167) 在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289) 在oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) 在oracle.jdbc.driver.OraclePreparedStatement。的executeQuery(OraclePreparedStatement.java:3628) 在oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)

+0

是否因爲您的用戶密碼已過期? – 2015-03-31 15:50:22

+0

@kucing_terbang不,用戶密碼未過期。 – Saurav 2015-03-31 16:11:38

+0

我們需要查看完整的錯誤消息,而不僅僅是兩個字的總結。 – skaffman 2015-04-01 03:19:11

回答

5

這種錯誤指示在JDBC薄驅動器,其是不能夠理解的錯誤服務器正在返回線路(套接字)。

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

如果這沒有幫助,那麼您需要聯繫Oracle支持。您將被問到的第一件事是提供發生此錯誤的連接的sqlnet蹤跡。這將有助於Oracle工程師瞭解發生故障時網絡上發生了什麼。

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

TRACE_LEVEL_SERVER = 16

這將增加一個跟蹤文件在您的跟蹤董事每個連接(在服務器上) 。不要在生產系統上這樣做,因爲它會顯着降低系統速度並會產生大量痕跡。

祝你好運。

0

它可能只是該連接被感染或無效。如果您的JDBC連接來自連接池,請務必確保您測試連接後保留。

3

增加堆空間!

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

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

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

+0

有同樣的問題。監控工具可以顯着幫助解決這類錯誤。 – gavenkoa 2017-06-13 11:03:26

1

在我的情況下,使用PreparedStatement的getGeneratedKeys()來獲取當前序列值導致協議違規異常。更換它獲得序列序電流值,如下所示:

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

解決了這個問題。