【问题标题】:SQLException: Protocol violation. Oracle JDBC Driver issueSQLException: 协议冲突。 Oracle JDBC 驱动程序问题
【发布时间】:2011-06-08 18:33:35
【问题描述】:

我得到以下异常:

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 警报日志,但我无法判断其中的任何内容与我的进程有关。不过,我不是预言机专家,也许我需要查看预言机设置。奇怪的是,我在不同的连接上运行了大约五个此类查询(其中几个稍微复杂一点),只有两个最简单的查询会遇到这个问题。

任何关于如何缩小问题范围的帮助或想法将不胜感激。

【问题讨论】:

  • 也许您的数据库服务器内存不足?您是否正确关闭了 Java 中的资源?这是发生在您的系列中的第一个查询运行还是后面的一个查询中?

标签: java oracle exception jdbc


【解决方案1】:

对于必须访问此页面的未来谷歌用户,这是我们遇到的问题。 协议违规异常正在应用程序日志和 Oracle 跟踪中记录。

Oracle 跟踪

这是来自 oracle 跟踪文件的错误

--- 检测到协议违反 ---

----- 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 trace 中看到错误?从逻辑上讲,驱动程序错误应该仅限于应用程序日志。 原因是当协议违反发生时,连接被破坏了。此连接已返回到连接池。任何使用该连接的用户或工作都将无法正常工作并且会遇到错误。 这就是为什么它会发生在随机的地方,随机的用户

解决方案

短期修复是在连接池中更改此属性。我们正在使用 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

【讨论】:

    【解决方案2】:

    显然将 -d64 添加到 java 命令行可以解决此问题。看起来像是 Solaris 64 位问题。

    【讨论】:

    • 对我来说,升级我的 ojdbc 驱动程序解决了这个问题。我跳到 11.2.0.2.0 一切都很好。
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2017-07-15
    • 2013-02-17
    • 1970-01-01
    • 2021-09-27
    • 2010-10-05
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多