java.sql.SQLException: 违反协议异常的一种解释
一次做应用升级出现了一个问题,描述如下:
升级分为两块,一块是数据库结构变更(表结构增加新字段);一块是应用程序的升级。
应用环境为:jboss4.0.5 + ibatis + spring 数据源在jboss的oracle-ds.xml文件中进行配置,通过spring的jndi方式进行查找 。
我先将数据库进行升级,更改表结构(增加字段),因为应用中的ibatis的查询采用的是ResultMap返回方式,返回定义的表结构字段,即使数据库发生变更,也不会产生影响。于是我大胆的进行脚本的执行。结果当我下午16:00数据库变更之后,几乎在同时就有人反应应用的一些查询功能无法使用,立刻查看出错日志:
Caused by: com.alibaba.generalorm.dao.DataAccessException: Data query error! --- The error occurred in sqlmap/CiaDissension.xml. --- The error occurred while applying a parameter map. --- Check the QUERY_ALL_DISSENSION_CATEGORY-InlineParameterMap. --- Check the statement (query failed). --- Cause: java.sql.SQLException: OALL8 处于不一致状态at com.alibaba.ibatis.BasicIBatisDao.query(BasicIBatisDao.java:315)at com.alibaba.china.rcc.riskdc.dao.DissensionCategoryDAO.getAll(DissensionCategoryDAO.java:40)at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getCategoryMap(DissensionServiceImpl.java:495)at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getCategory(DissensionServiceImpl.java:188)at com.alibaba.china.rcc.riskdc.web.action.DissensionAction.getCategory(DissensionAction.java:263)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.alibaba.webx.action.invoker.AbstractModuleMethodInvoker.executeNoArgMethod(AbstractModuleMethodInvoker.java:401)... 33 more
Caused by: com.alibaba.generalorm.dao.DataAccessException: Data query error! --- The error occurred in sqlmap/CiaDissension.xml. --- The error occurred while applying a parameter map. --- Check the QUERY_ALL_DISSENSION_BUSINESS-InlineParameterMap. --- Check the statement (query failed). --- Cause: java.sql.SQLException: 违反协议at com.alibaba.ibatis.BasicIBatisDao.query(BasicIBatisDao.java:315)at com.alibaba.china.rcc.riskdc.dao.DissensionBusinessDAO.getAll(DissensionBusinessDAO.java:19)at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getBusiness(DissensionServiceImpl.java:178)at com.alibaba.china.rcc.riskdc.web.action.DissensionAction.getBusiness(DissensionAction.java:249)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.alibaba.webx.action.invoker.AbstractModuleMethodInvoker.executeNoArgMethod(AbstractModuleMethodInvoker.java:401)... 33 more
<local-tx-datasource> <jndi-name>rccBopsDataSource</jndi-name> <use-java-context>false</use-java-context> <connection-url>jdbc:oracle:thin:@xx.xx.xx.xx:1521:xx</connection-url> <connection-property name="SetBigStringTryClob">true</connection-property> <connection-property name="defaultRowPrefetch">50</connection-property> <connection-property name="clientEncoding">GBK</connection-property> <connection-property name="serverEncoding">ISO-8859-1</connection-property> <driver-class>com.alibaba.china.jdbc.SimpleDriver</driver-class> <min-pool-size>1</min-pool-size> <max-pool-size>14</max-pool-size> <prepared-statement-cache-size>20</prepared-statement-cache-size> <metadata> <type-mapping>Oracle9i</type-mapping> </metadata> <idle-timeout-minutes>15</idle-timeout-minutes> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> <user-name>xx</user-name> <password>xx</password> </local-tx-datasource>
<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>