java.sql.SQLException: Protocol violation 解决方法

本文解析了在特定环境下出现的java.sql.SQLException: Protocol violation问题,深入探讨了可能的原因,包括CLOB字段长度过长导致的接收错误,并提供了降低和升级JDBC驱动版本的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇承接这一篇 :java.sql.SQLException: Protocol violation 问题解析

问题描述

应用可以正常启动,但是运行一段时间时候偶尔会出现这个错误。

java.sql.SQLException: Protocol violation: [100]
	oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:527)
	oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
	oracle.jdbc.driver.T4C7Ocommoncall.doOROLLBACK(T4C7Ocommoncall.java:68)
	oracle.jdbc.driver.T4CConnection.doRollback(T4CConnection.java:725)
	oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3970)
	org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)

这个问题发生的环境如下

  • Windows Server 2008
  • JDK 1.6.0_30
  • Tomcat 7
  • Spring 3.2.3 +Hibernate 4.2.2
  • Oracle:12.2.0.1.0
  • JDBC Driver:ojdbc6

原因及解析

以上报的是在receive()方法出错。
可能原因:
clob类型的字段中存储内容的长度过长(4193 字符?),导致驱动在接收(retrieve)出错。

解决方法

可能解法1:
降低ojdbc的版本,替换 ojdbc6 为 ojdbc14。

但是,将ojdbc6 修改为 ojdbc14,在保存的时候又会出现如下错误:



root cause
java.lang.AbstractMethodError

org.apache.commons.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)

org.apache.commons.dbcp.DelegatingPreparedStatement.setCharacterStream(DelegatingPreparedStatement.java:328)

org.hibernate.type.descriptor.sql.ClobTypeDescriptor$4$1.doBind(ClobTypeDescriptor.java:114)

org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93)

org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)

org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)

org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)

org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2786)

org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3191)

org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126)

org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456)

org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)

org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)

org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)

org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287)

org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)

org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)

org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)

org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)

org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)

org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)

org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:554)

org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)

org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)

org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)

org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)

org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)

这个 错误的原因是写入Clob类型字段有问题,报方法没有实现的错误。

终极解决方案

升级ojdbc6的版本。

使用WinRAR可以查看ojdbc6的具体版本号:
在这里插入图片描述
以上的版本是:

Implementation-Version: 11.2.0.4.0

到以下地址https://www.oracle.com/database/technologies/jdbcdriver-ucp-downloads.html
下载升级的ojdbc6的版本,下载后的版本号是:

Implementation-Version: 12.1.0.1.0

替换后重启应用,正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oscar999

送以玫瑰,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值