java经验总结二:ORA-08103: 对象不再存在
问题发生的环境: 在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: 对象不再存在的更多相关文章
- 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性
大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...
- 系统学习 Java IO (十二)----数据流和对象流
目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...
- Java基础 之二 类和对象
1.基础概念 1) 概念 简单来说,类是具有相同特征事物的抽象,比如有轮子的都可以抽象为车:对象则可以看做类的具体实例,比如创建一个法拉利的车,就是车这个类的实例. 抽象.封装.继承.多态是类的四个特 ...
- java多线程系列(二)---对象变量并发访问
对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- java web学习总结(七) -------------------HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java实验报告二:Java面向对象程序设计
Java实验报告二:Java面向对象程序设计 ...
- java 获取数组(二维数组)长度实例程序
我们可能知道 js有个length函数,java也有啊length函数 例 如果数组是data[],则data.length 代码如下 复制代码 byte[] phone =new byte[81]; ...
- java web 学习七(HttpServletResponse对象1)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
随机推荐
- leetcode 逆转字符串 当年的第一题,今天再写一遍,物是人非
public class Solution { public String reverseWords(String s) { if(s==null||s.length()==0) return &qu ...
- HDU1247 - Hat’s Words(Trie树)
题目大意 给定一些单词,要求你把所有的帽子单词找出来,如果某个单词恰好由另外两个单词连接而成,那么它就是帽子单词 题解 先把所有单词插入到Trie树,然后判断每个单词是不是帽子单词,做法就是:对于第i ...
- 新浪微博、腾讯微博、QQ空间、人人网、豆瓣 一键分享API
新浪微博: http://service.weibo.com/share/share.php?url= count=表示是否显示当前页面被分享数量(1显示)(可选,允许为空) & url=将页 ...
- PHP流程控制(一)
单项分支: if(bool判断); 这里只写一句话有作用! if(bool){ 这里可以写多句话! } 双向分支: if(bool判断){ 如果为真则执行这里的语句,可以写多句:(注意如这里没有括号, ...
- C++中的类访问控制
C++中 public,protected, private 访问标号小结 第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2 ...
- 你知道用AngularJs怎么定义指令吗?
前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方. Angularjs指令定义的API AngularJs的指令定义大致如下 ang ...
- 礼仪或许就是尊重的还有一个说法——leo鉴书61
<Leo鉴书(第1辑)>已登陆百度阅读,今后还将不断更新,免费下载地址:http://t.cn/RvawZEx 礼仪从字面上就区分成"礼"和"仪"两 ...
- 各种会义PPT
http://vdisk.weibo.com/s/dBzv2siaHK2H http://vdisk.weibo.com/wap/u/3460619722 https://yunqi.aliyun.c ...
- 安装64位ubuntu 14.04-搭建android开发环境
end
- felx基础知识
felx4将功能组件划分为3个命名空间分别是 fx:核心功能 mx:标准flex3组件组 s:新flex4 spark组件组