2015-03-31 202 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(); 
... 

解决了这个问题。