SQLException:违反协议.Oracle JDBC驱动程序问题

Ran*_*all 8 java oracle exception jdbc

我得到以下的重复:

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)
Run Code Online (Sandbox Code Playgroud)

Oracle系统在Solaris 5.10上运行10.2.0.3.0.jdbc驱动程序在JDK 1.6.0_21上运行(如果它是导入的,则java也在Solaris 5.10机器上运行).我已经尝试了几种不同的oracle瘦驱动程序,包括最新的和看起来与oracle版本完全匹配的驱动程序.

我正在运行的查询非常简单:"按key1,key2,key3从some_table顺序中选择*"然后迭代结果集并写入文件.该表有大约1200万行,所以我希望这个过程运行时间很长,但它似乎在5到15分钟内就会死掉.每次我运行它,它会在另一行上爆炸,所以我认为问题不在于数据.

我找到了oracle警报日志,但我无法分辨那里的任何内容与我的进程有关.不过,我不是oracle专家,也许我需要看一下oracle设置.奇怪的是,我在不同的连接上运行了大约五种类型的查询(一些情况稍微复杂一点),只有两个最简单的查询得到了这个问题.

任何有关如何缩小问题的帮助或想法将不胜感激.

Ran*_*all 6

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

  • 对我来说,升级我的ojdbc驱动程序修复此问题.我跳到了11.2.0.2.0,一切都很好. (2认同)

vsi*_*ngh 6

对于将来这个页面的未来googlers,这是我们遇到的问题.协议违规异常记录在应用程序日志和Oracle跟踪上.

Oracle跟踪

这是oracle跟踪文件的错误

---检测到协议违规---

----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
        select xyz
Run Code Online (Sandbox Code Playgroud)

从应用程序日志

Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];
Run Code Online (Sandbox Code Playgroud)

症状

这种例外偶尔会发生.堆栈跟踪中有不同的sql,这非常令人困惑.用sql plus运行sql工作正常.

根本原因

当oracle驱动程序尝试导出CLOB数据时抛出异常.只有少数记录发生这种情况,而不是全部记录.这样的数据是一个文件.在视觉上我们无法弄清楚该数据有什么问题.

为什么我们在oracle日志中看到错误?

因此,如果这是驱动程序缺陷,为什么我们在oracle跟踪中看到错误?逻辑上,驱动程序错误应仅限于应用程序日志.原因是当协议违规发生时,连接已损坏.此连接已返回到连接池.任何用户或作业何时使用该连接都不起作用并且会遇到错误.这就是为什么它会随机发生在随机用户身上的原因

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