精华内容
下载资源
问答
  • tomcat + Oracle + Druid连接池后台报错(java.sql.SQLException: 违反协议),很奇怪的是只有某种特殊情况下才报错,项目其他功能都运转正常,报错信息看最后面代码示例。 2. 可能原因(OALL8-jdbc与Oracle驱动...

    1. 报错背景

        tomcat + Oracle + Druid连接池后台报错( java.sql.SQLException: 违反协议),很奇怪的是只有某种特殊情况下才报错,项目其他功能都运转正常,报错信息看最后面代码示例。

    2. 可能原因(OALL8-jdbc与Oracle驱动版本不一致

        1、jdbc配置出错(驱动配置):oracle.jdbc.OracleDriver

        2、oracle驱动版本不对

             PLSQL中查看:select * from v$version;

            Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

            PL/SQL Release 11.2.0.4.0 - Production

            CORE 11.2.0.4.0 Production

            TNS for Linux: Version 11.2.0.4.0 - Production

            NLSRTL Version 11.2.0.4.0 - Production

       3、可能原因OALL8-jdbc与Oracle驱动版本不一致

           之前数据库用的版本是PL/SQL Release 10.2.0.5.0 - Production,后来升级到了PL/SQL Release 11.2.0.4.0 - Production,所以需要将jdbc升级对应版本。JDBC下载链接

         pom:

    <dependency>
    	<groupId>ojdbc</groupId>
    	<artifactId>ojdbc</artifactId>
    	<!-- <version>6</version> -->
    	<version>14-10gR3</version>
    </dependency>
    
    
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4.0</version>
    </dependency>

     

    Oracle版本对应的JDBC版本

    2. 可能原因(网上的一种靠谱的解答)

        原文链接

    2.1 背景

    项目中Oracle使用druid数据库连接池,为了提高访问数据库的效率,开启了PreparedStatement Cache。但是随着项目的运行,也出现了一些问题,在项目运行的过程中,给表添加字段后,会一直出现"ORA-17401:违反协议"异常。应用重启后,不再抛出。

    问题描述
    在应用持续运行中,给生产库中的某张表添加字段,然后涉及该表查询的地方不断抛出"ORA-17401:违反协议"异常,直到重启引用。

    异常描述
    "ORA-17401:违反协议"是TTC(Two-Task Common)的一个错误。TTC是oracle通信协议里较为靠上的一层,用于处理客户端与数据库服务器通信时的协议差异,比如转换字符集和数据类型。用以确保Oracle的客户端和服务器在不同的网络交互模式(比如TCP/IP、共享内存)下可以透明地交互。


    2.2 问题定位

            1. 重启应用异常不再抛出,反应出重新建立数据库链接能够修复该错误;

            2. 部分项目使用其他连接池没有此问题,而druid与之最大的差异就是开启了PreparedStatement Cache。PreparedStatement实际上避免了相同SQL语句重复解析和建立游标,同时也复用了相同的数据结构。那么当服务器端的表结构即数据结构发生改变时,很有可能TTC就会无法处理这种改变。而使用普通的Statement时,因为不存在数据结构的复用,所以也就不会出现"违反协议异常"。

    所以,根据以上两点,关闭了PreparedStatement Cache后,重复之前错误的流程,不再抛出该异常。

    但是选择druid就是为了其PreparedStatement Cache这个特性,然后只能继续找问题,最后查阅代码,发现之前的mapper.xml中,查询都是直接使用的select *,对部分改为select [字段] 后,发现问题不再出现,但是和其他开发人人员沟通后,认为将目前项目所有的查询修改,工作量较大,风险较高,而且同样的查询在每个项目中都有,也不想进行重构,所以,只能用其他的办法来解决。

    2.3 最终解决方案

    在和其他人员沟通后,只能将修改后的影响降为最低,所以只能通过如下代码,在每次修改表结构后,主动清除每个应用服务器上每个数据库连接的PreparedStatement Cache,以此来尽量避免由用户行为触发异常的出现。

        @Resource(name = "druidDataSource")
        private DruidDataSource druidDataSource;
     
        public void clearDruidStatementCache() {
            Log.info("DruidDataSource", "清除Druid的Statement Cache Start......");
            if (druidDataSource != null) {
                try {
                    druidDataSource.clearStatementCache();
                } catch (SQLException e) {
                    Log.error("DruidDataSource", "清除Druid的Statement Cache Error", e);
                }
            }
            Log.info("DruidDataSource", "清除Druid的Statement Cache End......");
        }
    

    2.4 问题的查找过程

    最初用的是druid1.0.25版本,根据http://www.oschina.net/news/79452/druid-1-0-27中的信息,在1.0.27版本中,进行了如下修改

    根据其中所说,如果执行出错,可以从PSCache中移除,所以将版本换到了1.0.27,但是问题还是依然存在,只好继续查。

    根据http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto#Oracle_8i,_9i_&_10g,注意如下内容

    For Oracle 9i onwards you should use oracle.jdbc.OracleDriver rather than oracle.jdbc.driver.OracleDriver as Oracle have stated that oracle.jdbc.driver.OracleDriver is deprecated and support for this driver class will be discontinued in the next major release.

    而我们用的是oracle.jdbc.driver.OracleDriver,并不是oracle.jdbc.OracleDriver,但是并不一定要进行修改。

    这是因为根据https://github.com/alibaba/druid/issues/1598中所说,在1.0.29版本中已经兼容了两种写法,不过我还是按要求改成了正确的。

    以上基本就是整个问题的查找过程,不过最后因为种种原因,暂时只是采取了一种比较不合理的方法来规避,尽量减少用户来触发从而降低体验。

    3. 结合自身项目最终问题原因

    tomcat 中context.xml配置的驱动为:oracle.jdbc.OracleDriver,而底层类DBpool.java中open方法中却是oracle.jdbc.driver.OracleDriver

    druid的PreparedStatement Cache这个特性导致需要

    OALL8-jdbc:下载对应版本的jdbc

            <dependency>
                  <groupId>com.oracle</groupId>
                  <artifactId>ojdbc6</artifactId>
                  <version>11.2.0.4.0</version>
            </dependency>

    4. 问题报错信息

    问题报错信息
    三月 06, 2019 1:26:54 下午 com.alibaba.druid.pool.DruidDataSource error
    严重: discard connection
    java.sql.SQLException: 违反协议: [ 0, ]
         at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:669)
         at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
         at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
         at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:202)
         at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:45)
         at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:933)
         at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075)
         at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1718)
         at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1678)
         at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:332)
         at com.alibaba.druid.filter.FilterChainImpl.statement_execute(FilterChainImpl.java:2600)
         at com.alibaba.druid.filter.FilterAdapter.statement_execute(FilterAdapter.java:2473)
         at com.alibaba.druid.filter.FilterEventAdapter.statement_execute(FilterEventAdapter.java:188)
         at com.alibaba.druid.filter.FilterChainImpl.statement_execute(FilterChainImpl.java:2598)
         at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.execute(StatementProxyImpl.java:147)
         at com.alibaba.druid.pool.DruidPooledStatement.execute(DruidPooledStatement.java:558)
         at com.sinosoft.sysframework.reference.DBManager.preDeal(DBManager.java:238)
         at com.sinosoft.sysframework.reference.DBManager.open(DBManager.java:220)
         at com.sinosoft.sysframework.reference.DBManager.open(DBManager.java:193)
         at com.sinosoft.sysframework.reference.DBManager.open(DBManager.java:174)
         at com.sinosoft.sysframework.reference.DBManager.open(DBManager.java:161)
         at com.sinosoft.utiall.dbsvr.DBPrpDcodeCom.findByConditions(DBPrpDcodeCom.java:365)
         at com.sinosoft.utiall.blsvr.BLPrpDcodeCom.query(BLPrpDcodeCom.java:143)
         at com.sinosoft.utiall.blsvr.BLPrpDcodeCom.translateCode(BLPrpDcodeCom.java:267)
         at com.sinosoft.indiv.ci.interfS.ProposalQueryBusinessDecoder.transProfitFG(ProposalQueryBusinessDecoder.java:1583)

     

     

    声明:本文第二章转载自“雨幕下的稻田”的心得,未经允许请不要以原创名义进行转载,尊重原创。

    展开全文
  • java.sql.SQLException: 违反协议

    万次阅读 2011-11-18 10:50:51
    异常:java.sql.SQLException: 违反协议  一般是指JDBC驱动的错误。但是遇到这种情况的时候  第一步要做的是重启web容器,检查是否可以正常运行 。  如果不能正常运行再检查JDBC驱动包的问题是不是当前数据库...
    异常:java.sql.SQLException: 违反协议
       一般是指JDBC驱动的错误。但是遇到这种情况的时候
       第一步要做的是重启web容器,检查是否可以正常运行 。

       如果不能正常运行再检查JDBC驱动包的问题是不是当前数据库对应的版本

    更多的内容见:

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

    展开全文
  • Cause: java.sql.SQLException: 违反协议

    万次阅读 2018-04-13 11:32:52
    Cause: java.sql.SQLException: 违反协议 这个错误 也是第一次碰到 ,但是 我觉得 只要是错误 ,就说明 人家设计者肯定也知道,并作出了归纳。然后我开始在报错的日志里从最上面一点点找,找到了selectbYid()这个...

    项目 maven    webservice 接口测试 

    数据库oracle11g


    测试时出现一个错误. Cause: java.sql.SQLException: 违反协议   这个错误 也是第一次碰到  ,但是 我觉得 只要是错误 ,就说明 人家设计者肯定也知道,并作出了归纳。

    然后我开始在报错的日志里从最上面一点点找,找到了selectbYid()这个方法   返回一个对象 ,这个看起来没错 ,紧接着 出现了  error code 1704   ,这下面就是 关于事务如何处理的,最后处理失败  报错 违反协议   


    找了几遍 都没有发现问题,后来 思考了一下 为什么 调用mybatis查询方法后就开始 出事了?

    继续抽丝剥茧,想到了 我返回的对象里面有CLOB字段,那么这个会不会有关系?

    我无从验证 ,但是 这就引起了我的注意,如果说报错和JDBC有关系,那么应当留意这之前的每一个SQL ,于是 我将查询并返回对象的方法 修改了,而采用的是Insert()自带的返回带主键ID的对象 (对象在Insert前 属性除了ID都是有值的,insert后ID也有值了),这样操作后,再去运行,此时日志出现了变化:



    再打印完insert  SQL  参数后,正常运行下面的SQL操作 并打印日志   之前出现的 error code 1704 消失了


    由此可见,出错原因是:我在Insert后,查询并返回一个对象  对象数据库是CLOB,属性是String  ,这就可能引发问题了 


    总结下原因,引发error code 1704错误的原因很复杂  ,我这里出现的原因是  CLOB  取出来 转String的时候 出现问题  导致无法封装到对象 ,我采取绕开这个查询,

    展开全文
  • 今天在Java编程遇到了一个奇怪的现象,jar包应用往Oracle11g插入数据时效率很低...###Cause:java.sql.SQLException:违反协议 ;uncategorizedSQLExceptionforSQL[];SQLstate[null];errorcode[17401];违反协议;nested...

    今天在Java编程遇到了一个奇怪的现象,jar包应用往Oracle11g插入数据时效率很低,经查应用日志,有的可以插入成功,有的报错:

    ### Cause: java.sql.SQLException: 违反协议
    ; uncategorized SQLException for SQL []; SQL state [null]; error code [17401]; 违反协议; nested exception is java.sql.SQLException: 违反协议

    经查,是因为应用使用的是ojdbc4.jar作为访问Oracle11g的驱动,ojdbc版本较低,所以会出现如上错误。

    解决方法:

    1、替换掉应用jar包中的ojdbc(我使用的是WinZip替换的);

    2、把应用jar包的"META-INF/MANIFEST.MF"文件中的ojdbc版本的引用修改至最新(修改MANIFEST.MF对包的引用Export-Package)。

    上述两种是比较快的方法,如果不好使,那就在源码中替换掉ojdbc,然后重新打包即可。

    展开全文
  • ERROR org.hibernate.transaction.JDBCTransaction: - JDBC rollback failed  ...java.sql.SQLException: 违反协议   at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)   
  • 异常:java.sql.SQLException: 违反协议 一般是指JDBC驱动的错误。但是遇到这种情况的时候 第一步要做的是重启web容器,检查是否可以正常运行 。 如果不能正常运行再检查JDBC驱动包的问题是不是当前数据库对应的...
  • 今天做项目遇到个问题,在Oracle数据库添加了个字段 “STARTTIME” varchar2() 类型,结果查询的时候报错java.sql.SQLException, 从网上看有说的是jar包驱动的问题。 我的实际解决方案为更换字段名称 “STARTTIME...
  • java.sql.SQLException: 违反协议异常的一种解释   转自:http://willam2004.iteye.com/blog/900077   一次做应用升级出现了一个问题,描述如下: 升级分为两块,一块是数据库结构变更(表结构增加新字段);...
  • [color=red]java.sql.SQLException: 违反协议: [12] at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:464) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) at oracle.jdbc.driver.T4C8Oall...
  • 今天OMS后代报出了一些异常,java.sql.SQLException: 违反协议,OALL8 处于不一致状态。整个应用都不能用,重启一下就好了。第一次出异常的地方为 [code="java"][OMS][2011-02-12 20:51:57 312] ERROR ...
  • 使用连接池操作数据库报错,报错信息:java.sql.SQLException:Io异常:违反协议 原因:我这里是因为连接关闭错误 应该先关闭ResultSet,其次是Statement/PreparedStatement,最后是Connection
  • --- Cause: java.sql.SQLException: 违反协议   at com.alibaba.ibatis.BasicIBatisDao.query(BasicIBatisDao.java: 315 )   at com.alibaba.china.rcc.riskdc.dao.DissensionBusinessDAO.getAll...
  • ORACLE违反协议异常

    千次阅读 2019-10-10 11:57:59
    应用正常运行已有一段时间,某天突然出现不能打开oracle数据库连接,sql异常:违反协议 异常原因 oracle默认用户机制,密码180天过期,在还有7天过期时会提示修改密码,次原因导致本次异常的产生 解决方案 sys账号...
  • 1. Tomcat8.5 换成8.0 2. 项目WEB-INF\lib下ojdbc6.jar换成Oracle安装目录中的jar包 d:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar (Oracle安装目录) 3. 360浏览器切换成极速模式
  •  如果运行后台使用Oracle数据库的java程序提示java.sql.SQLException: 违反协议错误,就要立即检查连接数据库的JDBC驱动是否正确。  Oracle 11G的JDBC驱动并不能用于Oracle 10G Release 2的数据库,因此必须...
  • Caused by: java.sql.SQLException: 违反协议 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:...
  • WEB应用在连接数据库的时候,有时会抛出违反协议的报错,这种报错正常都是因ojdbc的jar包版本...java.sql.SQLException: 违反协议 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180) at o...
  • 超越LeetCode SQL 该存储库涵盖对LeetCode和经典面试问题SQL的补充分析,性能优化与开发效率之间的权衡以及它如何与一般数据库设计考虑... 许多笔记本的灵感来自于人们违反保密协议并在Quora,Glassdoor和1point3acre
  • IMP-00020的解决过程

    2008-07-21 18:07:00
    今天给一台测试机导数据,导完后应用在连接的时候... nested exception is java.sql.SQLException: 违反协议 但是这个错只在访问某个表的时候报,而访问其他表的时候正常,这个表的结构如下: SQL> desctabname...
  • weblogic错误处理

    千次阅读 2012-10-28 14:03:46
    1,在应用做压力测试时报错,但正常访问时没有问题 系统是ssh2架构 java.sql.SQLException: OALL8 ... 违反协议 uncategorized SQLException for SQL []; SQL state [99999]; error code [17401];  解决方法:
  • 关联博客:Druid java.sql.SQLException: 违反协议 / Oracle连接报错生违反协议 1. 生产现象 数据库锁表,且为不同表出现锁表 服务线程监控,达到最大连接数40 2. 排查步骤 2.1 查看服务器tomc...
  • 经过我们的查看后,发现是类型varchar的字段,我们使用条件传入了数值型的值,由于担心违反保密协议,在此就不贴图了,由我重现一下类似情况给大家看一下。 问题重现 首先我们先创建一张用户表test_user,其中USER...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

违反sql协议