问题发生的环境: 在springMvc+mybatis框架中,调用oracle的存储过程时,碰到的一个这样的异常:

org.springframework.jdbc.UncategorizedSQLException:
### Error querying database.  Cause: java.sql.SQLException: ORA-: 对象不再存在

### The error may exist in com/coscon/wechat/oracle/mapper/VgmCntrMapper.xml
### The error may involve com.coscon.wechat.oracle.mapper.VgmCntrMapper.findVgmInfoByBkgNo
### The error occurred while handling results
### SQL: {call  SP_VGM_CNTR_QUERY(?,         ?,         ?,         ?         )  }
### Cause: java.sql.SQLException: ORA-: 对象不再存在

; uncategorized SQLException ]; error code []; ORA-: 对象不再存在
; nested exception : 对象不再存在

问题的原因

  调用的oracle存储过程【sp】中,存在一个事物级别的临时表,例如:

create global temporary table TEMP_VGM_CNTR
(
  vgm_uuid               VARCHAR2(),
  cntr_num               VARCHAR2(),
  cntr_type              VARCHAR2(),
  bkg_num                VARCHAR2(),
  bl_num                 VARCHAR2(),
  vgm_tare_wt            NUMBER(,),
  vgm_wt                 NUMBER(,),
  vgm_wt_unit            VARCHAR2(),
  excel_logs             VARCHAR2()
)
on commit delete rows;

  事物级临时表,当发生事物提交的时候,临时表中的数据就会被清空。

  对于返回游标的存储过程来说,放在临时表中的数据就会被清空。那么在Java代码去调用存储过程时候,如果没有特殊的事物配置,在调用完存储过程后,就代表事物的结束,数据自然就没有了。so,程序就产生了“ORA-08103: 对象不再存在”的异常。

问题的解决

  在springMVC+mybatis的数据库配置中添加事物处理机制:

<bean id="oracleTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <!--代表数据库环境:oracle-->
        <property name="dataSource" ref="oracleDataSource" />
        <qualifier value="ebTransactionManager"/>
        <!-- <property name="typeAliasesPackage" value="com.coscon.wechat.oracle.entity" />    -->
    </bean>
    <bean id="oracleSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <!---具体数据库配置-->
           <property name="dataSource" ref="oracleDataSource" />
       </bean>
       <!-- 可通过注解控制事务,即事物处理的机制 -->
    <tx:annotation-driven transaction-manager="oracleTransactionManager"/>
       <!-- Mapper接口所在包名,Spring会自动查找其下的Mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="oracleSessionFactory"/>
        <property name="basePackage" value="com.coscon.wechat.oracle.mapper" />
    </bean>  

注意:

  由于项目中会出现配置了多个数据源的情况,注解事务时显示指明事务由谁管理。例如:

<qualifier value="ebTransactionManager"/>
然后在你调用的方法的service层,添加事物注解:  
@Override
    @SuppressWarnings("unchecked")
    @Transactional(value = "ebTransactionManager",propagation= Propagation.REQUIRED)
    public List<VgmCntr> findVgmInfoByBkgNo(String bkgNum, String blNum,
            String cntrNum) {
        Map<String, Object> map=new HashMap<String, Object>();
        map.put("bkgNum", bkgNum);
        map.put("blNum", null);
        map.put("cntrNum", null);
        vgmCntrMapper.findVgmInfoByBkgNo(map);
        List<VgmCntr> list=(List<VgmCntr>)map.get("rows");
        return list;
    }

java经验总结二:ORA-08103: 对象不再存在的更多相关文章

  1. 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...

  2. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

  3. Java基础 之二 类和对象

    1.基础概念 1) 概念 简单来说,类是具有相同特征事物的抽象,比如有轮子的都可以抽象为车:对象则可以看做类的具体实例,比如创建一个法拉利的车,就是车这个类的实例. 抽象.封装.继承.多态是类的四个特 ...

  4. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  5. java web学习总结(七) -------------------HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  6. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  7. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

  8. java 获取数组(二维数组)长度实例程序

    我们可能知道 js有个length函数,java也有啊length函数 例 如果数组是data[],则data.length 代码如下 复制代码 byte[] phone =new byte[81]; ...

  9. java web 学习七(HttpServletResponse对象1)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

随机推荐

  1. 对 Linux 专家非常有用的 20 个命令

    原文链接:http://www.oschina.net/translate/20-advanced-commands-for-linux-experts?from=20130811 对中级 Linux ...

  2. flume服务的搭建

    搭建前先统一时间,关闭防火墙,使用的jar包版本是1.6.0的 服务配置有两种方式 第一种:具体步骤如下: 1.将jar包传至node1上,解压至根目录 2.更改目录名,使用如下命令:mv apach ...

  3. 判断两棵树是否相等 leecode

    很简单 提交代码 https://oj.leetcode.com/problems/same-tree/ iven two binary trees, write a function to chec ...

  4. nyoj重建二叉树(不真的建立)

      感觉c++很陌生啊 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用 ...

  5. 解决 MyEclipse 10 中 JSp页面 “return false” 报错问题

    1.MyEclipse ->. Preferences 2.validation ->>找到JavaScript validator for Js files  builder 下面 ...

  6. Codeforces245H - Queries for Number of Palindromes(区间DP)

    题目大意 给定一个字符串s,q个查询,每次查询返回s[l-r]含有的回文子串个数(题目地址) 题解 和有一次多校的题目长得好相似,这个是回文子串个数,多校的是回文子序列个数 用dp[i][j]表示,s ...

  7. 如何获取、下载、安装fortran编译工具ifort

    今天接触到ifort,不知如何下载安装.遂GOOGLE之,很多文章给出连接并表示说在网页上下载即可.可往往事与愿违,新的问题是:链接已经失效:获取ifort的办法又不同了: 于是,我探索到新的获取安装 ...

  8. Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序

    Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序).没错,Robocopy的功能是拷贝文件,你也许会觉得无聊并且要翻阅下一篇文章 ...

  9. poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

    最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...

  10. Java异常处理的误区和经验总结

    本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...