SQLException:oracle中的协议冲突

时间:2015-03-31 15:37:47

标签: java oracle jdbc oracle11g ojdbc

我收到了“违反协议”。 我有一个在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)               在oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)               在oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)               at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)               at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)               at oracle.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 oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)               在oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)

7 个答案:

答案 0 :(得分:6)

这样的错误表明JDBC瘦驱动程序中的一个错误,它无法理解服务器在线路(套接字)上返回的内容。

您始终可以尝试使用最新的JDBC瘦驱动程序,希望能够解决该错误。截至今天,最新的是12.1.0.2。

如果这没有用,那么您需要联系Oracle支持。您将被要求提供的第一件事是提供发生此错误的连接的sqlnet跟踪。这将有助于Oracle工程师了解发生故障时网络上发生的情况。

要打开sqlnet跟踪,请在服务器上编辑sqlnet.ora文件并添加

TRACE_LEVEL_SERVER = 16

将为跟踪控制器(服务器上)中的每个连接添加跟踪文件。不要在生产系统上这样做,因为它会大大减慢系统速度并产生大量痕迹。

祝你好运。

答案 1 :(得分:5)

增加堆空间!

我有一个随机出现的确切错误。

应用程序内存不足,由于代码中的逻辑导致抛出不相关的异常,OutOfMemory错误丢失。

  

应用程序不应处理throwables和错误的原因之一。

答案 2 :(得分:1)

在我的情况下,使用PreparedStatement的getGeneratedKeys()获取当前序列值会导致协议违规异常。用序列中的序列电流值替换它,如下:

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

解决了这个问题。

答案 3 :(得分:0)

可能只是连接被感染或无效。如果JDBC连接来自连接池,请始终确保在保留时测试连接。

答案 4 :(得分:0)

这通常表示TCP / IP流量已损坏。这可能是由于注入的流量或丢包引起的。执行ifconfig以查看您的任何网络接口是否受到异常大量丢包的影响。为避免出现问题,当您指出数据库和Java程序在同一台计算机上运行时,请尝试使用回送接口127.0.0.1(localhost),而不是使用外部IP来连接数据库,或者仅使用测试。

对此没有进一步研究,但是我猜想如果驱动程序和数据库版本相距太远,也可能会发生这种情况。获取与已安装的oracle匹配的驱动程序应该不太困难。

答案 5 :(得分:0)

ojdbc7.jar-12.1.0.2版中已修复的问题(版本可以在jar的META-INF文件中检入)

答案 6 :(得分:0)

在我的情况下,当我们尝试使用 ojdbc 驱动程序从另一个数据源中提取数据时,发生了这种情况,我们没有连接到直接数据源。一旦我们通过直接连接而不是使用 db link 进行连接,问题就会停止出现。
我注意到的另一件事是,当我们尝试从包含中文/日文字符的列中提取数据时,问题以一致的方式发生。
最后,分块提取数据也是一个合适的解决方案。
HTH