场景:转:java.sql.SQLException: 违反协议错误的一种解释

转:java.sql.SQLException: 违反协议异常的一种解释

转:

java.sql.SQLException: 违反协议异常的一种解释

转自:http://willam2004.iteye.com/blog/900077

一次做应用升级出现了一个问题,描述如下:升级分为两块,一块是数据库结构变更(表结构增加新字段);一块是应用程序的升级。应用环境为:jboss4.0.5 + ibatis + spring 数据源在jboss的oracle-ds.xml文件中进行配置,通过spring的jndi方式进行查找 。我先将数据库进行升级,更改表结构(增加字段),因为应用中的ibatis的查询采用的是ResultMap返回方式,返回定义的表结构字段,即使数据库发生变更,也不会产生影响。于是我大胆的进行脚本的执行。结果当我下午16:00数据库变更之后,几乎在同时就有人反应应用的一些查询功能无法使用,立刻查看出错日志:

Java代码

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

Java代码

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

为什么会出现违反协议的问题?马上google一下,有些人说是因为数据库的字段类型与java中使用的类型不一致导致,但查看了ibtais的map文件,老的应用代码根本还没有使用新的的字段!后来找pla共同排查,也没有发现应用程序哪里会出现问题,便打电话给DBA让他查下数据库,DBA咨询了一位资格较老的DBA,他说以前也出现过这种情况,只要将应用重启下,就好了。马上重启,果然问题解决了,违反协议的错误没有再报。查找原因:在做升级前,我自己在开发环境也做过模拟,并没有出现如果应用不重启,数据库变更而报“违反协议”的错误。而我看了下发布环境与开发环境差异,唯一的差异是开发环境没有采用jboss+jndi的方式获取数据源,而采用了tomcat+c3p0的方式获取数据源。于是我开始实验。Tomcat+C3P0启动方式:1.准备好更改数据库脚本。2.在开发环境用tomcat启动应用,并访问到涉及表结构变更的页面。3.执行数据库脚本,确保表结构发生了变更。4.刷新在步骤2的页面,查看后台输出和前台页面输出。5.一切正常,没有抛出违反协议或处于不一致状态的错误日志。JBoss4.0.5+JNDI启动方式1.准备好更改数据库脚本。2.在开发环境用jboss启动应用,并访问到涉及表结构变更的页面。3.执行数据库脚本,确保表结构发生了变更。4.刷新在步骤2的页面,查看后台输出和前台页面输出。5.出现了违反协议和处于不一致状态的问题。总结:由此可以看出,出现这个问题与ibatis没有关系,而与数据源的获取方式有关,一种是通过Spring+c3p0直接注入DataSource;一种是在oracle-ds.xml文件中配置,然后在spring中通过jndi的方式进行查找,获取数据源。第二种在数据库变更的情况下,就必须进行应用重启,否则就会抛出违反协议或处于不一致的状态。但根本原因到底是什么呢?我还在寻找。===================================================咨询了大少,并不是因为数据源配置模式没有关系,用c3p0或者jndi等,而是与数据源的配置方式有关:在oracle-ds的配置如下:

Java代码

rccBopsDataSource

false

jdbc:oracle:thin:@xx.xx.xx.xx:1521:xx

true

50

GBK

ISO-8859-1

com.alibaba.china.jdbc.SimpleDriver

1

14

20

Oracle9i

15

org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter

xx

xx

其中prepared-statement-cache-size参数解释为: - the number of prepared statements per connection to be kept open and reused in subsequent requests. They are stored in a LRU cache. The default is 0 (zero), meaning no cache.为每个打开的数据库连接缓存了一定数量的prepared statement.他们是存在LRU cache中,如果设值为0,那么将不缓冲。这里我们设值了每个连接缓存20条prepared statment。而在c3p0的配置中:

Xml代码

class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">

com.mchange.v2.c3p0.DataSources.pooledDataSource

1

1

1

5

1800

1000

30

1000

false

5000

lt;/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的详细参数

tomcat登录违反协议_java.sql.sqlexception: 违反协议相关推荐

  1. java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释

    一次做应用升级出现了一个问题,描述如下: 升级分为两块,一块是数据库结构变更(表结构增加新字段);一块是应用程序的升级. 应用环境为:jboss4.0.5 + ibatis + spring 数据源在 ...

  2. Druid java.sql.SQLException: 违反协议 / Oracle连接报错生违反协议

    1. 报错背景 tomcat + Oracle + Druid连接池后台报错( java.sql.SQLException: 违反协议),很奇怪的是只有某种特殊情况下才报错,项目其他功能都运转正常,报 ...

  3. java.sql 拒绝连接_java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝

    java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝 at oracle.jdbc.dbaccess.DBError.throwSqlException( ...

  4. java索引丢失怎么解决_java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1解决办法...

    java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 1 at oracle.jdbc.driver.DatabaseError.throwSqlException( ...

  5. java帳戶登錄_java.sql.SQLException: ORA-28000: 帐户已被锁定

    java.sql.SQLException: ORA-28000: 帐户已被锁定 然后按照以前的办法找到了解锁的方法,想到可能是某个同事登录失败次数过多.因为oracle 默认的策略是oracle11 ...

  6. odbc java 驱动程序_java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配...

    今天把sql server 2008 r2装了起来,64位的,然后就迫不及待地体验连接数据库的操作,编程语言是java.我一开始学了一种非常老的连接方式,使用JDBC-ODBC桥.初次使用不太熟练,所 ...

  7. mysql 超时异常_java.sql.SQLException:超出锁定等待超时;尝试在MYSQL中重启事务异常...

    我在MYSQL中使用一个表名"test",它在事务T1期间锁定,在20分钟内完成.当我在这20分钟内通过另一个事务T2更新这个表时.我收到一个例外: - 11:58:38,584 ...

  8. mysql中00933错误_java.sql.SQLException: ORA-00933: SQL 命令未正确结束错误解决

    在程序运行时,程序报sql错误"nested exception is java.sql.SQLException: ORA-00933: SQL 命令未正确结束",具体错误如下所 ...

  9. Java oracle查询语句无法赋值给_java.sql.SQLException: 无法转换为内部表示 -〉java 查询oracle数据库返回错误信息...

    java.sql.SQLException: 无法转换为内部表示 Query: SELECT * FROM  nontheasttycoon Parameters: [] at org.apache. ...

最新文章

  1. 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
  2. 最终选型 Blazor.Server:又快又稳!
  3. 前端模块化工具--webpack学习心得
  4. java照片墙_基于jQuery实现照片墙自动播放特效
  5. js 控制鼠标_JS逆向 | 面向小白之eval混淆
  6. android打开网络连接失败怎么办,《我叫MT Online》安卓版网络连接失败怎么解决?...
  7. 洛谷 P1090 合并果子
  8. osgi java web_在Tomcat中使用Java Web应用程序的OSGi软件包
  9. 也就只有程序员才能看懂的文章~
  10. android 屏幕共享 chrome,Chrome屏幕共享功能接入指南
  11. python 会议室预约系统解决方案_会议室预约管理系统方案书.pdf
  12. Java实现彩色二维码
  13. 从前慢-SpringCloud
  14. 从六度分隔到无尺度网络
  15. python中-是什么意思
  16. 浅谈面试经验(面试官角度)
  17. dataframe 按条件筛选行
  18. c语言中怎么使用float,float在c语言中怎么用
  19. java list去除最后一个元素_如何快速删除list中的最后一个元素?
  20. 微信小程序 image图片组件实现宽度固定 高度自适应

热门文章

  1. EXCLE自动计算设置
  2. 解决install sass-loader 引入 ,版本过高问题
  3. 矩形件排样 matlab,一种矩形件优化排样的切割式填充方法与流程
  4. 怎么进行SEO优化?
  5. 拼多多网店运营推广技巧有哪些
  6. 在学校计算机协会的宣传标语,FS电脑协会宣传标语
  7. python初学者笔记——百度搜索关键词提取问题解决
  8. 逻辑卷与分区大小调整
  9. python第六七天作业
  10. 专访变设龙:重新定义设计 颠覆传统企业图片管理方式