java.sql.SQLException: 违反协议,OALL8 处于不一致状态
今天OMS后代报出了一些异常,java.sql.SQLException: 违反协议,OALL8 处于不一致状态。整个应用都不能用,重启一下就好了。第一次出异常的地方为
[OMS][2011-02-12 20:51:57 312] ERROR [TP-Processor11] JDBCTransaction.rollback(168) | JDBC rollback failedjava.sql.SQLException: 违反协议 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:150) at oracle.jdbc.driver.T4CConnection.doRollback(T4CConnection.java:567) at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:1136) at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:265) at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:288) at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:183) at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:162) at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:625) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:800) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:777) at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:339) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:50) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy40.updateNodeNetByIdPath(Unknown Source) at com.wondertek.mobiletv.oms.webapp.action.NodeAction.linkNodeToSpecNode(NodeAction.java:476) at sun.reflect.GeneratedMethodAccessor1520.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:592) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229) at com.wondertek.mobiletv.oms.webapp.interceptor.AppLogInterceptor.intercept(AppLogInterceptor.java:124) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
网上说提交的数据类型长度大于数据库或者说是数据库驱动允许的最大值,就会出现上述错误。通过com.wondertek.mobiletv.oms.webapp.action.NodeAction.linkNodeToSpecNode(NodeAction.java:476查找相当操作日志。
6760793resNodeNetId=32946,,destiNodeNetId=56320,,flag=contMenu_linkToNode,NodeAction -- linknodetospecnode12-FEB-11 08.51.53.001000 PM024207760826resNodeNetId=32946,,destiNodeNetId=56320,,flag=contMenu_linkToNode,NodeAction -- linknodetospecnode12-FEB-11 08.51.49.725000 PM024208760824resNodeNetId=31786,,destiNodeNetId=56320,,flag=contMenu_linkToNode,NodeAction -- linknodetospecnode12-FEB-11 08.51.23.817000 PM024209760792resNodeNetId=31786,,destiNodeNetId=56320,,flag=contMenu_linkToNode,NodeAction -- linknodetospecnode12-FEB-11 08.51.05.918000 PM02420相关源节点15632012-FEB-11 08.50.18.776000 PM/68581/909610/3列首页/全能看6858111/mainbycol/qnk290961没有找到相关源节点32946
网上的解释。
Java call pl/sql 时如果使用 array 参数,则需要使用
oracler的特定语法--描述符.
一个描述符对象代表了pl/sql中的一个 array type.
获取一个 描述符对象 需要使用 oracle.jdbc.OracleConnection.
这个分析的比较透彻
9. <props>
10. <prop key="acquireIncrement">1</prop>
11. <prop key="initialPoolSize">1</prop>
12. <prop key="minPoolSize">1</prop>
13. <prop key="maxPoolSize">5</prop>
14. <prop key="maxIdleTime">1800</prop>
15. <prop key="maxIdleTimeExcessConnections">1000</prop>
16. <!-- 自动收缩连接用的,单位秒 -->
17. <!-- 自动重连需要的三个参数 -->
18. <prop key="acquireRetryAttempts">30</prop>
19. <prop key="acquireRetryDelay">1000</prop>
20. <prop key="breakAfterAcquireFailure">false</prop>
21. <!-- 获取一个connection需要的时间,单位毫秒 -->
22. <prop key="checkoutTimeout">5000</prop>
23. </props>
24. </list>
25. </property>
26. lt;/bean>
<bean id="testDataSource"
/>
<props>
<prop key="acquireIncrement">1</prop>
<prop key="initialPoolSize">1</prop>
<prop key="minPoolSize">1</prop>
<prop key="maxPoolSize">5</prop>
<prop key="maxIdleTime">1800</prop>
<prop key="maxIdleTimeExcessConnections">1000</prop>
<!-- 自动收缩连接用的,单位秒 -->
<!-- 自动重连需要的三个参数 -->
<prop key="acquireRetryAttempts">30</prop>
<prop key="acquireRetryDelay">1000</prop>
<prop key="breakAfterAcquireFailure">false</prop>
<!-- 获取一个connection需要的时间,单位毫秒 -->
<prop key="checkoutTimeout">5000</prop>
</props>
</list>
</property>
</bean>
上网查了下,影响到preparedStatment cache的参数有两个:maxStatements和maxStatementsPerConnection 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭,默认为0。
继续实验:
1、将c3p0配置增加maxStatements和maxStatementsPerConnection并都设值20。
修改数据库表结构,刷新访问页面。
后台抛出违反协议和处于不一致状态的错误提示。
2.将oracle-ds.xml文件配置更改prepared-statement-cache-size为0。
修改数据库表结构,刷新访问页面。
后台没有抛出违反协议和处于不一致状态的错误提示。
附参考文章:
http://community.jboss.org/wiki/configdatasources 讲解jboss中关于datasource的参数
http://msq.iteye.com/blog/60387 讲解c3p0的详细参数
http://www.iteye.com/topic/900077