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

  1. org.springframework.jdbc.UncategorizedSQLException:
  2. ### Error querying database. Cause: java.sql.SQLException: ORA-: 对象不再存在
  3.  
  4. ### The error may exist in com/coscon/wechat/oracle/mapper/VgmCntrMapper.xml
  5. ### The error may involve com.coscon.wechat.oracle.mapper.VgmCntrMapper.findVgmInfoByBkgNo
  6. ### The error occurred while handling results
  7. ### SQL: {call SP_VGM_CNTR_QUERY(?, ?, ?, ? ) }
  8. ### Cause: java.sql.SQLException: ORA-: 对象不再存在
  9.  
  10. ; uncategorized SQLException ]; error code []; ORA-: 对象不再存在
  11. ; nested exception : 对象不再存在

问题的原因

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

  1. create global temporary table TEMP_VGM_CNTR
  2. (
  3. vgm_uuid VARCHAR2(),
  4. cntr_num VARCHAR2(),
  5. cntr_type VARCHAR2(),
  6. bkg_num VARCHAR2(),
  7. bl_num VARCHAR2(),
  8. vgm_tare_wt NUMBER(,),
  9. vgm_wt NUMBER(,),
  10. vgm_wt_unit VARCHAR2(),
  11. excel_logs VARCHAR2()
  12. )
  13. on commit delete rows;

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

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

问题的解决

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

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

注意:

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

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

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. 如何破解Adobe Acrobat9 pro?(转)

    解决办法: 1.到 C:\Program Files\Common Files\Adobe\Adobe PCD\cache 文件夹下找到 Cache.db,并删除此文件 . 2.打开Adobe Acr ...

  2. JavaScript下拉框去除重复内容

    下拉框去除重复内容 <script type="text/javascript" src="http://www.joleye.com/libraries/java ...

  3. xcodebuild导出ipa方法

    xcode 5.x版本导出ipa是不需要开发者账号,而xcode6以后导出ipa必须要求选择开发者team,无法绕开,但我们使用xcodebuild命令行可以无视这个限制 环境: mac osx 10 ...

  4. kafka在虚拟机环境的优化

    首先是,多磁盘的并发的问题.不管怎么说,虚拟机环境至少剥夺了单个kafka同时使用多个磁盘的优势.也就意味着,在同一个虚拟机,同一个topic,最好只有一partition:当然,不同topic之间p ...

  5. 韦东山yy公开课笔记(2)--各种杂的问题

    1. 编译器的版本和glibc库有对应关系吗,如何查看glibc的版本(glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc),编译器是不是只带glibc被编译生成的 . ...

  6. 在Eclipse中使用Maven插件 博客分类: Java相关技术

    简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...

  7. NOIP2015 子串 (DP+优化)

    子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...

  8. shell脚本应用(2)--变量,数值和字符串

    变量 定义,赋值: var=value 引用 $var,${var} 特殊变量 $?上条命令状态 $*/$@所有参数列表 $#参数个数 $0执行的命令名称 $1/${10}第1/10个参数 数值运算 ...

  9. poj3101

    不难,结果: 程序: import java.math.*; import java.util.*; public class Main { public static void main(Strin ...

  10. 为Android安装BusyBox

    大家是否有过这样的经历,在命令行里输入adb shell,然后使用命令操作你的手机或模拟器,但是那些命令都是常见Linux命令的阉割缩水版,用起来很不爽.是否想过在 Android上使用较完整的she ...