java.sql.SQLException: Protocol violation 解决方法
2020-07-29 23:31
260 查看
本篇承接这一篇 :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.TransactionA 4000 spectSupport.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
替换后重启应用,正常。
相关文章推荐
- java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date 解决方法
- java.sql.SQLException: ORA-00911: 无效字符 解决方法
- java里连接sqlserver对象名无效的解决方法 java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 无效
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的一种解决方法
- java.sql.SQLException: The value supplied cannot be converted to DECIMAL 解决方法
- java.sql.SQLException: ORA-00911: 无效字符 解决方法
- MySql系列:中文写入数据库出现错误java.sql.SQLException: Incorrect string value: '\xE5\xxxx' for column 'xxxx' at row 1及其解决方法
- java.sql.SQLException: ORA-00911: invalid character 解决方法(转)
- java.sql.SQLException: ORA-00911: 无效字符 解决方法
- 出现“java.sql.SQLException: 无法转换为内部表示”解决方法
- 数据库连接报错解决方法:java.sql.SQLException: Unknown character set index for field '255' received from server.
- 有关java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)的解决方法
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的一种解决方法
- 任何“java.sql.SQLException: 无法转换为内部表示”解决方法
- Mabatis报错 java.sql.SQLException: Parameter number 3 is not an OUT parameter 解决方法
- java.sql.SQLException: ResultSet is closed解决方法
- java.sql.SQLException: Field 'id' doesn't have a default value解决方法
- 中文为”???“的解决方法,和Hibernate:Caused by: java.sql.SQLException: Incorrect string value: '\xE8\x8F异常
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)解决方法
- java.sql.SQLException: The user specified as a definer ('root'@'%') does not exist 解决方法