Java SQLException:协议冲突。Oracle JDBC驱动程序问题
我得到了以下奖励:Java SQLException:协议冲突。Oracle JDBC驱动程序问题,java,oracle,exception,jdbc,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.throwS
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驱动程序运行在JDK1.6.0_21上(如果是导入,java也运行在Solaris 5.10机器上)。我尝试了几种不同的oracle精简驱动程序,包括最新的和与oracle版本完全匹配的驱动程序
我运行的查询相当简单:“按key1、key2、key3从某个表顺序选择*”,然后遍历结果集并写入文件。该表大约有1200万行,因此我预计该进程将运行很长时间,但它似乎会在5-15分钟内消失。每次我运行它时,它都会在不同的行上爆炸,所以我认为问题不在于数据
我找到了oracle警报日志,但无法确定其中是否有任何内容与我的流程相关。不过,我并不是oracle专家,也许我需要看看oracle的设置。奇怪的是,我在不同的连接上运行了大约五种这种类型的查询(有两种更复杂),只有两种最简单的查询遇到过这个问题
任何关于如何缩小问题范围的帮助或想法都将不胜感激。显然,在java命令行中添加-d64可以解决此问题。看起来像是Solaris 64位版本的问题。对于未来的谷歌用户来说,这是我们遇到的问题。 正在应用程序日志和Oracle跟踪中记录协议冲突异常 Oracle跟踪 这是oracle跟踪文件中的错误 ---检测到协议冲突--- 来自应用程序日志
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.1(假);
到
ds.1(真)
现在,当池返回到池的损坏连接时,在应用程序借用此连接之前,它将测试有效性。若连接不可用,池将放弃,然后应用程序将获得一个新的/有效的连接
如果启用连接池日志,您应该会看到异常,这通常会被忽略
驱动程序升级
从OJDBC 12.1.0.1升级到OJDBC 12.1.0.2解决了问题,即使是有问题的行
其他参考链接
也许您的数据库服务器内存不足?您是否正确地关闭了Java中的资源?这是在您系列中的第一个查询运行时发生的还是在以后的一个查询运行时发生的?对我来说,升级ojdbc驱动程序修复了这一问题。我跳到11.2.0.2.0,一切都很好。
Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];