精华内容
下载资源
问答
  • 公司某现场经常在停服务之前报SQLException:ORA-01013。正常业务也偶发SQLException:ORA-01013。 问题描述: 软件版本如下: 数据源:alibaba druid-1.1.9版本 数据库:Oracle11g 11.2.0.3.0 JDBC驱动:ojdbc7-...

    项目场景:

    公司某现场经常在停服务之前报SQLException:ORA-01013。正常业务也偶发SQLException:ORA-01013。

    问题描述:

    软件版本如下:
    • 数据源:alibaba druid-1.1.9版本
    • 数据库:Oracle11g 11.2.0.3.0
    • JDBC驱动:ojdbc7-11

    报错异常堆栈如下:

    2020-11-04 09:41:22.228 ERROR [Thread-170] druid.sql.Statement[Slf4jLogFilter.java:149] 
    {conn-10738, pstmt-20197} execute error. select *
    from xxxxx
    where xxxxxxxxxxxxxxx
    java.sql.SQLException: ORA-01013: 用户请求取消当前的操作
    
    	at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    	at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
    	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1035)
    	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
    	at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:953)
    	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:897)
    	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1188)
    	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3386)
    	at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3487)
    	at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3051)
    	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
    	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
    	at com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:619)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
    	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
    	at com.alibaba.druid.filter.FilterAdapter.preparedStatement_execute(FilterAdapter.java:1080)
    	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
    	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167)
    	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:498)
    	at sun.reflect.GeneratedMethodAccessor514.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
    	at com.sun.proxy.$Proxy36.execute(Unknown Source)
    	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
    	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    	at sun.reflect.GeneratedMethodAccessor503.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
    	at com.sun.proxy.$Proxy34.query(Unknown Source)
    	at sun.reflect.GeneratedMethodAccessor503.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
    	...
    	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
    	at com.sun.proxy.$Proxy34.query(Unknown Source)
    	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    	...
    	at sun.reflect.GeneratedMethodAccessor666.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
    	...
    	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649)
    	...
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at java.lang.Thread.run(Thread.java:748)
    

    原因分析:

    1. 观察Oracle数据库服务端是否存在异常
      结论: 查看Oracle Alert日志,发现每次报错时,数据库都在进行redo日志切换,怀疑可能是redo日志文件大小设置过小导致,查阅资料发现设置为20分钟切换一次比较合理,调大redo日志大小之后问题仍然存在。但是异常从SQLException:ORA-01013变成了SQLTimeOutException:ORA-01013。证明问题不在Oracle服务端。

    2. 测试环境做压力测试,复现问题,观察问题出现是否存在规律
      结论: 复现之后发现报错位置并无规律。

    3. 发现每次停服务之前问题发生频率较高,看stop.sh脚本中发现每次停服务之前会进行jmap dump操作。jmap dump时会发生STW,可能导致SQL执行超时导致异常。
      结论: stop.sh脚本去掉dump操作之后,问题发生频率明显降低。

    4. 怀疑druid在调用oralce jdbc时传递的queryTimeout参数存在问题。
      验证方案:
      首先在本地复现此报错。
      给某条记录加行级锁,编写测试代码设置queryTimeout为1之后执行更新操作,复现了ORA-01013问题
      通过druid filter,打印出PreparedStatement的queryTimeout变量值,观察是否此值配置存在问题。
      结论:
      (1) 默认未配置时queryTimeout变量值全为0(为0代表永不超时),问题存在。
      (2) 将DruidDataSource的queryTimeout设置为1800,代表SQL执行超时时间为30分钟,问题存在。
      不是此参数存在问题导致,可能是数据库驱动对此变量处理存在问题,无论此值设置多少,都会存在ORA-01013.

    5. 既然排除了数据库、数据源的问题,那只剩下jdbc驱动包的问题了。升级oracle驱动包为ojdbc8-12.2.0.1.0.jar
      结论: 更换之后,压测之后未复现此问题。

    github issue地址:
    https://github.com/alibaba/druid/issues/4178


    解决方案:

    升级JDBC驱动程序
    展开全文
  • ORA-01013问题分析处理

    千次阅读 2021-05-31 11:27:06
    ORA-01013: user requested cancel of current operation 发现问题 下午12:20服务器报警CPU过高, 其中两台12:31自动恢复, 一台持续告警至12:51 现场检查发现日志出现大量 1、经分析日志发现12:21开始3台服务器开始...

    发现问题
    下午12:20服务器报警CPU过高,
    其中两台12:31自动恢复,
    一台持续告警至12:51

    现场检查发现日志出现大量
    1、经分析日志发现12:21开始3台服务器开始出现数据库交互报错日志开始出现:(日志有处理)
    #[ap, ...] ERROR 2021-- 12:31:19.181 [*** ***, ***, **] com...SqlTemplate.selectOne:45 -

    Error querying database. Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation

    The error occurred while setting parameters

    SQL: select * from FM_TABLE where COMPANY = ?

    Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation

    由于与数据库交互都报此类错误,导致服务响应异常。
    2、及时找dba确认无锁表,外部查询工具查询正常
    3、不仅仅FM_TABLE出现超时,其他表也有查询超时
    4、后期分析awr无明显异常
    5、不是只有一个交易报错,其他交易也有报错
    6、开始有部分insert操作报同样错误
    7、报错期间运行内存不足,出现多次gc

    问题分析
    经分析由于服务器压力增加,cpu使用率上升,同时部分调用外服务接口响应时间延长(20+),日志打印增加。导致出现阻塞线程:64个应用业务处理线程、16个日志打印线程。
    进而内存不能释放,内存不足频繁GC,最终cpu使用率继续提高。

    经测试环境复现使用objbc6:10.2.0时,当程序响应过慢时会报java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation;
    替换成较新版本objbc8:12.2.0.1时则不会报错。
    测试环境debug模式发现,objbc6:10.2.0、objbc8:12.2.0.1同时存在时会调用objbc6:10.2.0部分方法。

    处理方案
    近期处理方案:
    1、 删除相对较旧驱动,使用新驱动objbc8:12.2.0.1。
    2、 优化日志打印,较少不必要日志的打印,减少服务器压力。
    3、 调整调用外系统超时时间,减少线程等待,尽快释放资源。
    4、 机器配置较好,调整应用启动内存更好使用机器性能。
    远期处理建议:
    1、 调整部分交易响应方式为异步(比如通知短信等)。
    2、 根据需要横向扩展分散压力。

    展开全文
  • --- Cause: java.sql.SQLException: ORA-01013: 用户请求取消当前的操作 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:91) at ...
  • 问题: 今天测试环境突然爆出一个... Cause: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作 ### The error may exist in class path resource [mapper/custom/RespDataIntegrationMapperCustom.x

    问题:

    今天测试环境突然爆出一个错,如下:

    org.springframework.dao.QueryTimeoutException: 
    ### Error querying database.  Cause: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
    
    ### The error may exist in class path resource [mapper/custom/RespDataIntegrationMapperCustom.xml]
    ### The error may involve defaultParameterMap
    ### The error occurred while setting parameters
    ### SQL: select count(*) from RESP_DATA_INTEGRATION where CREATE_TIME >=  to_date(?,'yyyy-mm-dd hh24:mi:ss') and  CREATE_TIME <   to_date(?, 'yyyy-mm-dd hh24:mi:ss')
    ### Cause: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
    
    ; ORA-01013: 用户请求取消当前的操作
    ; nested exception is java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
    
       at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:76)
       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
       at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
       at com.sun.proxy.$Proxy203.selectOne(Unknown Source)
       at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
       at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83)
       at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
       at com.sun.proxy.$Proxy241.findDataIntegrationCountByTime(Unknown Source)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
       at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:73)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
       at com.sun.proxy.$Proxy242.findDataIntegrationCountByTime(Unknown Source)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
       at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:73)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
       at com.sun.proxy.$Proxy242.findDataIntegrationCountByTime(Unknown Source)
       at com.sinosoft.messageweb.web.service.impl.RespDataIntegrationServiceImpl.findDataIntegrationCountByTime(RespDataIntegrationServiceImpl.java:70)
       at com.sinosoft.messageweb.web.service.impl.RespDataIntegrationServiceImpl$$FastClassBySpringCGLIB$$26183e75.invoke(<generated>)
       at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
       at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:752)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)
       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
       at com.sinosoft.messageweb.web.service.impl.RespDataIntegrationServiceImpl$$EnhancerBySpringCGLIB$$e0f5b2ce.findDataIntegrationCountByTime(<generated>)
       at com.sinosoft.messageweb.web.service.impl.RespDataIntegrationServiceImpl$$FastClassBySpringCGLIB$$26183e75.invoke(<generated>)
       at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
       at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:752)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
       at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)
       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
       at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
       at com.sinosoft.messageweb.web.service.impl.RespDataIntegrationServiceImpl$$EnhancerBySpringCGLIB$$23d9c55a.findDataIntegrationCountByTime(<generated>)
       at com.sinosoft.messageweb.web.quartztask.SynchronousData.execute(SynchronousData.java:233)
       at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
       at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
    Caused by: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
    
       at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
       at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
       at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
       at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
       at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
       at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
       at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
       at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59)
       at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747)
       at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904)
       at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082)
       at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780)
       at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343)
       at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3887)
       at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1079)
       at weblogic.jdbc.wrapper.PreparedStatement.execute(PreparedStatement.java:119)
       at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
       at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
       at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
       at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
       at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
       at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
       at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:143)
       at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
       at com.sun.proxy.$Proxy278.query(Unknown Source)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
       at sun.reflect.GeneratedMethodAccessor154.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
       ... 49 common frames omitted
    Caused by: oracle.jdbc.OracleDatabaseException: ORA-01013: 用户请求取消当前的操作
    
    

    分析下原因

    • 1.数据库锁
      网上搜了一下,有的说是锁的原因,所以开始以为是锁的原因,但是通过查询数据库锁表发现没有数据,所以,报错应该不是因为这个原因。

      查看哪个表被锁

      select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
      
    • 2.mybatis设置default-statement-timeout时间过短
      然后看了下代码,发现我们项目根本没有配置mybatis的连接超时时间,通过看源码发现,没有设置超时时间默认应该为null.
      mybatis源码

    • 3.weblogic配置问题
      在weblogic服务中有个JTA配置,默认配置为30s,将其改为超过数据库的执行时间即可
      在这里插入图片描述

    解决方法

    最后通过分析,修改了weblogic的配置解决问题

    展开全文
  • SSM 框架中,进行单表 SELECT 分页查询,每页 10 条,分页语句采用 between and,查询到 3000 页左右或大于 3000 页,立刻报异常 “java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作。”并再次查询...
  • Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation 字面意思是,客户端取消数据库连接,于是报错。 这个报错分两个部分: 1.数据库服务器 ORA-01013: user requested ...

    问题

    具体的场景是,cat监控到查询报错。

    报错信息

    Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation
    

    字面意思是,客户端取消数据库连接,于是报错。

    这个报错分两个部分:
    1.数据库服务器
    ORA-01013: user requested cancel of current operation //这个是数据库服务器返回的错误

    2.客户端
    Cause: java.sql.SQLTimeoutException //这个是java里的异常调用栈

    原因

    原因1-数据库锁

    网上搜了一下,说是锁的原因,所以开始以为是锁的原因,但是后面分析发现不是锁的原因,因为查询是普通的查询,普通的查询没有锁的问题,也就是说,任何锁,都不影响读。所以,报错应该不是因为这个原因。


    原因2-客户端取消连接

    根据报错信息字面的信息,就是因为客户端取消数据库连接。实际上,应该也是这个原因。但是,客户端为什么会取消数据库连接?根据报错信息的第一个部分,是超时。可是,为什么会超时?这个报错是间隔性的,一般情况都是正常的,在生产执行sql耗时不到1s,而且有的报错sql数据量比较小但是也会报错,所以也应该不是sql本身的问题。

    到目前为止,没有找到本质的原因,只是知道字面的原因。所以,也没有办法解决。


    其他信息

    1.数据库连接池用了阿里的druid
    这次上线更新了数据库连接池的配置,因为最近几天都在报错:连接重置,reset connection,recover connection,之类的报错信息。
    原因是因为连接失效,解决方法是,开启连接池的空闲连接检查配置项。然后,这次上线就更新了数据库连接池的配置,连接重置的错误没了,但是上线之后,却又报错客户端取消连接。所以,也有可能是和这次更新了数据库连接池配置有关。但是其他的项目,配置也一样,却又没有报错。

    2.执行了sql,也没有问题,耗时正常
    虽然不是锁的原因,但是也找dba看了锁,也是正常的,即都是短暂的锁(多次执行查询锁的sql,锁记录一直在变),没有长期持有锁不释放的情况。

    3.cat监控到每个报错信息,也有对应的慢sql(也有报错信息,即异常调用栈)
    这个也和报错信息的第一部分也对的上,就是执行sql的时间超时了。但是不知道为什么超时。

    4.数据库锁
    其他部门也有同样的错误,而且是读写分离,所以更应该不是数据库锁的原因。


    总结

    1.不是同一笔订单报错,其他的订单号也有报错

    2.应该不是锁的原因
    1)没有长期没有释放的锁,我和dba一起确认,锁的占用都是短暂的,所以应该不是锁的原因
    2)数据库的锁,不会影响查询,现在的查询只是普通的查询,所以应该不是锁的原因
    3)问了其他部门,他们读写分离,查询的时候也有这个问题,所以应该不是锁的原因

    3.应该是偶尔查询数据库时间太久导致
    异常的时候,cat里的error和慢sql,都有异常,而且是同一笔订单。

    具体分析是,由于数据库查询太久,应用超时,断开数据库连接,然后报错:ORA-01013: user requested cancel of current operation,即客户端取消了数据库连接。

    本地模拟两个客户端的查询for update,后面的for update就会一直阻塞——停止后面的查询,也会报错提示:ORA-01013: user requested cancel of current operation。所以,客户端取消了连接,就会报错提示这个信息,在应用里比较可能的原因就是因为查询数据库太久导致应用超时,然后应用就取消了连接,从而报错这个提示信息。

    解决方法

    经过分析,不太可能是慢sql的问题,所以还是连接的问题。目前的连接失效检测,是大于最小数量的连接,才检测。所以还是存在连接失效的问题,如果连接失效,客户端和服务器都不知道,然后客户端超时,然后取消数据库连接,就可能会导致这个问题。

    连接也可能被防火墙断开,防火墙一个小时会断开一次长连接。

    所以,可以开启小于最小数量的连接失效检测,具体就是保活配置keepalive。


    版本

    保活功能是后面才加的,所以要用比较新的版本,目前用的1.1.9,虽然这个版本也支持,但是最好还是用新的版本,因为新版本修复了保活配置的bug。

    推荐至少用1.1.16
    1.1.21 //推荐
    最新1.1.22


    参考

    https://github.com/alibaba/druid/wiki/KeepAlive_cn

    知识点

    数据库的锁

    这里只讲数据库的行锁,一般两种情况会被锁住:
    1.更新数据的时候,其他事务不能更新数据
    2.查询 for update,其他事务不能更新数据

    也就是说,以上两种情况,都不影响读数据,读数据是没有任何锁的,除非加了for update。

    实际上,任何锁,都不影响读数据,至少不影响普通的查询,即查询没有加for uodate。


    oracle-查询锁记录

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,
    那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容。

    (1)锁表查询的代码有以下的形式:

    select count(*) from v$locked_object;  
    
    select * from v$locked_object;
    

    (2)查看哪个表被锁

    select b.owner,b.object_name,a.session_id,a.locked_mode 
    from v$locked_object a,dba_objects b 
    where b.object_id = a.object_id;
    

    (3)查看是哪个session引起的

    select a.OS_USER_NAME, c.owner, c.object_name, b.sid, b.serial#, logon_time
    from v$locked_object a, v$session b, dba_objects c
    where a.session_id = b.sid
     and a.object_id = c.object_id
     order by b.logon_time;
    

    (4)杀掉对应进程

    执行命令:alter system kill session '1025,41';  需要用户有权限操作
    其中1025为sid,41为serial#.
    

    https://blog.csdn.net/wangchuanmei/article/details/80017108


    共享锁和排他锁影响读吗?

    共享锁和排它锁的区别不是说影响读,两个锁都不影响读,其实任何锁都不影响读。而是有其他的细节区别,具体区别不是重点,不讲。

    因为测试的时候,不管是共享锁(查询 for update),还是排他锁(更新数据,即增删改),一个事务更新,另外一个事务仍然可以读数据。


    测试

    1.两个for update,后面的for update就会阻塞,因为获取锁但是获取不到
    2.一个for uddate,一个普通查询,可以正常查询
    3.一个更新,一个查询,可以正常查询

    以上,都是在第一个操作不提交的情况下测试的。

    补充

    除了报错:客户端取消连接,现在仍然会报错-连接失效:

    2020-07-02 16:27:09.619|ERROR|pEMJhNXhtOyE-536-93|com.alibaba.druid.util.JdbcUtils.close:86||close statement error
    java.sql.SQLRecoverableException: Closed Connection
    	at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5416)
    	at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1585)
    	at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1570)
    	at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
    	at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:84)
    	at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:88)
    	at com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal(DruidAbstractDataSource.java:1361)
    	at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1297)
    	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)
    	at com.alibaba.druid.filter.FilterAdapter.dataSource_getConnection(FilterAdapter.java:2745)
    	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)
    	at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)
    	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)
    	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1231)
    

    所以,应该还是失效连接的问题,具体原因就是小于最小数量的连接,没有检查失效连接,所以解决方法还是必须得配置保活keepAlive。

    展开全文
  • 今天统计接口测试时发生以下异常: java.lang.RuntimeException: org.springframework.dao.QueryTimeoutException:... Cause: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作 ### The error may...
  • 这个错误的原因有多种,我遇到这个错误的原因是:在单元测试中往数据库中插入数据,在Oracle可视化工具中,将已插入的数据delete,再次执行插入程序时,报错ORA-01013:用户请求取消当前的操作; 原因:delete之后...
  • 场景 oracle报错:ORA-01013: user requested cancel of current operation 分析: 一般是因为update的时候被锁定了。 解决方案 使用有解锁权限的用户,解锁即可。 查看被锁住的session SELECT s.username, -- 用户...
  • ORA-01013 user requested cancel of current operation 用户取消当前操作 这个一般认为是超时的错误。 解决方法 简化SQL 我将那段复杂的SQL语句改为视图,这样原先复杂的SQL就不会出现在Kettle中了。我个人...
  • http://www.itpub.net/thread-1418343-1-1.html这里有人问到了,试了下,这样可以做到。declare cacel_create EXCEPTION; PRAGMA EXCEPTION_...
  • java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作   ORA-01013原因:oracle 锁表了 ,导致了sql 语句一直在运行 无法提交事务。 解决方案:将数据中的事务进行提交,或者回滚即可 比如:在...
  • Caused by: java.sql.SQLException: ORA-01013: 用户请求取消当前的操作 这个问题有没有哪位大佬知道是什么原因导致的oracle数据库报错?请大佬指导一下。谢谢 其中就是在操作Select * from 表 where 条件的时候...
  • 最近在调试程序,其中一个update语句报了:用户请求取消当前的操作的问题,在仔细一看,是该条语句执行超时了。 于是: 1.检查sql语句是否写错,把它拷贝出来,在Oracle客户端执行了一下,可以执行,并且没有超时...
  • kettel报错:Caused by: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作 原因:两边数据库的字段类型大小不一致,修改类型的大小即可。 我的情况是:把oracle数据库某个表的数据导入达梦数据库...
  • 异常:ORA-01013: 用户请求取消当前的操作
  • 我odbc 连接数据库 执行 sql语句总是报错 java.sql.SQLException: ORA-01013 报错用户请求取消当前的操作 实际是超时问题 具体的执行的语句如下 update dm.t_dm_role e set USERIDS =',147,150,724,' where e....
  • 之后再登录进去,想再次测试pl/sql块就不行了,一样报ora-01013的错误 思考与解决方案 这个问题,我觉得是因为先前的scott会话卡在DBMS里了,没有正常撤销,所以只要我kill掉那个会话(其实质我还是不太清楚)...
  • 145) … 71 more Caused by: java.sql.BatchUpdateException: ORA-01013: user requested cancel of current operation at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:...
  • ORA-12520错误解决方法  ORA-12520听程序无法为请求的服务器类型找到可用的处理程序: 1)数据库是专用服务器,但是在tnsname.ora配置中设置了连接方式为shared,这种情况下打开tnsname.ora,   把(server = shared) ...
  • 2013年8月19日 星期一 16时16分04秒 在做一个界面导出功能时,报以下错误: ... java.sql.SQLException: ORA-01013: user requested cancel of current operation at oracle.jdbc.driver.SQLSta...
  • 今天我碰到的case就是time...The Oracle docs note this on the ora-01013 error*: ORA-01013 user requested cancel of current operation  Cause: The user interrupted an Oracle operation by entering CTR...
  • ORA-04031: unable to allocate 4032 bytes of shared memory ("shared pool","java/lang/StringSYS","joxlod: in ehe","ioc_allocate_pal") ORA-06512: at "SYS.DBMS_JAVA", line 0 ORA-06512: at line 2 这样的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,009
精华内容 403
关键字:

Ora-01013