Java代码工具箱之超出游标最大数
1. Java大量写入oracle时容易出现此错。经过此错,也触动自己要深刻理解 java 的 prepareStatement 等对象,及数据库的连接与释放。
2. 原因:经常会出现在 for 循环中进行数据库写入操作。
3. 案例:我在将Excel导入到Oracle数据库中时,在遍历Excel的每一行数据时,都执行了语句
conn.prepareStatement(sql);
结果每次执行到2000行时出现游标错误。更正后,一次顺利导入5000条数据。
class myCode{ Connection con = null;
PreparedStatement pre = null;
ResultSet result = null; void readExcel(){
for(...)
for(...)
update();
} void update(){
String sql = "update myTabe set A=? where id=?";
pre = conn.prepareStatement(sql);
pre.setString(1,A);
pre.setLong(2, 123); pre.executeUpdate(); //报错
} static void main(String[] args){
connDB()
initDbObj()
readExcel()
close(DbOjb)()//close ps,rs
closeDB()//close conn
} }
正确的 update()函数应该如下:(2017年5月26日 更新,下方法也不是很好的实践代码,最好的做法将conn.prepareStatement提出到for循环外)
//正确代码
void update(){
String sql = "update myTabe set A=? where id=?";
pre = conn.prepareStatement(sql);
pre.setString(1,A);
pre.setLong(2, 123); pre.executeUpdate(); //重点
if( pre != null ){
pre.close();
}
} //pre对象用完必须立马关闭,不要放到最后和 conn一起关闭。
//否则,每次pre被设置一次,就会申请一个游标,一般游标才300个
//很快就会报错。
——————————————————————
2017年5月26日 更新:上面代码有问题。
String sql = "update myTabe set A=? where id=?";
pre = conn.prepareStatement(sql);
根本不应该放在 for 循环内部。应提出到 for 循环之外的上面。
更合适的代码应该为:
class myCode{ Connection con = null;
PreparedStatement pre = null;
ResultSet result = null; String sql = "update myTabe set A=? where id=?";
pre = conn.prepareStatement(sql); void readExcel(){
for(...)
for(...)
update();
} void update(){ pre.setString(1,A);
pre.setLong(2, 123); pre.executeUpdate(); } static void main(String[] args){
connDB()
initDbObj()
readExcel() close(DbOjb)()//close ps,rs
closeDB()//close conn
} }
或者使用较复杂的 “PreparedStatement的批量提交功能” 。
Java代码工具箱之超出游标最大数的更多相关文章
- Java代码工具箱之链接Oracle
1. 需要oracle的 odbc jar包 2. 代码 3. 注意:ps对象和statement对象最好用完立即释放,尤其是读写数据库代码出现在 for 循环语句中时. 否则会出现游标不够的情况, ...
- Java代码工具箱_用Set给List/Vector去重
参考 方法一:需要2个容器,1个迭代去重,1个作为结果容器. 此方法其实想法比较简单也是正常思路: package com.yonyou.test; import java.util.List; im ...
- Java代码工具箱之控制台输出重定向_控制台输出到文件
1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...
- Java代码工具箱之解析单行单列简单Excel
1. 使用开源工具 jxl.jar 2. 功能:解析常规Excel.xls格式测试可行,xlsx未测试.Excel测试格式为常规类似table这种简单布局文件.第一行为标题,后面行为内容.代码 可正确 ...
- java.sql.SQLException: ORA-01000: 超出打开游标的最大数
实际上,这个错误的原因,主要还是代码问题引起的. ora-01000: maximum open cursors exceeded. 表示已经达到一个进程打开的最大游标数. 这样的错误很容易出现 ...
- Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...
- oracle异常处理——ORA-01000:超出打开游标最大数
oracle异常处理--ORA-01000:超出打开游标最大数https://www.cnblogs.com/zhaosj/p/4309352.htmlhttps://blog.csdn.net/u0 ...
- 21. orcle导出sql脚本时,提示“超出打开游标最大数”
1.解决办法:修改下打开游标最大数即可 SQL> show parameter open_cursors;NAME TYPE ...
- IntelliJ IDEA,代码行宽度超出限制时自动换行
转自:http://my.oschina.net/angerbaby/blog/471351 当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能 ...
随机推荐
- C#正则表达式快速入门
作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助. [内容] 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 ...
- 防止表单submit或按钮button多次连续点击提交
如上例子:当我点击提交按钮触发submitQuartz()函数 防止用户连续点击提交操作 方法一:获取当时点击时间,根据时间差判断 $scope.submitQuartz=function () { ...
- 11gR2 ASM RAC + ASM RAC dataguard配置
1.环境说明 --primary端配置 Primary RAC Node1 Node2 Public IP 192.168.56.120 192.168.56.122 Private IP 10.0. ...
- 怎么在Vue中使用Base64格式的背景
问题发生于一次mock数据,生成了base64格式的东西,因为编码包在一个变量中,不知道怎么直接在 :style 中引入. 解答1:格式background-image: url(此处是我们mock生 ...
- C#基础之基本类型
本丝花了近半年,终于将<CLR Via C#>这本书看完了(请不要BS本人的看书速度T_T),这确实是一本好书,大大们推荐的果然值得一读. 虽然很多东西还没有尽得其要,我常想在自己深刻掌握 ...
- AJAX (分页)
<!-- 企业新闻列表开始,图尺寸550*310,如果没图,则在li上加on --> <div class="common-box new-box"> &l ...
- poj(2406) kmp
题目链接:https://vjudge.net/problem/POJ-2406 kmp学习:https://blog.csdn.net/starstar1992/article/details/54 ...
- Windows 命令行基础(博主推荐)
不多说,直接上干货! 见 https://blog.henix.info/blog/windows-cmdbasic/
- mybatis + log4j2 问题 java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerWrapper
root cause java.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerWrapper 网上资料比较 ...
- ubuntu下apk的反编译
今天调试一个程序的时候,因为需要上传数据到服务器,但是程序太过久远了,服务器上传的地址就忘记了,但是源码又不在我这里,因为要的急所以就被逼无奈的情况下想到了反编译,我用的是Linux Mint 14. ...