2011-01-13 158 views
8

我收到以下错误时抛出:SQLException:违反协议。甲骨文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) 

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警报日志,但我不能说那里有什么和我的进程有关。尽管如此,我不是Oracle专家,也许我需要看一下oracle的设置。奇怪的是,我在不同的连接上运行了大约五种类型的查询(一对更复杂一些),只有两个最简单的查询会遇到这个问题。

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

+0

也许你的数据库服务器上运行的内存?你是否正确地关闭了Java中的资源?这是发生在你的系列中的第一个查询运行还是后来的一个? – Riggy 2011-01-13 21:24:21

回答

6

显然,在java命令行中添加-d64可修复此问题。看起来像Solaris 64位问题。

+2

对我来说,升级我的ojdbc驱动程序解决了这个问题。我跳到11.2.0.2.0,一切都很好。 – Muel 2013-10-29 03:56:42

5

对于未来需要此页面的Google员工而言,这里是我们遇到的问题。 应用程序日志和Oracle跟踪记录了协议违规异常。

Oracle跟踪

这是Oracle跟踪文件错误

---协议违规DETECTED ---

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

解决方案

短期固定在连接池来改变这种属性。我们正在使用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