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代码工具箱之超出游标最大数的更多相关文章

  1. Java代码工具箱之链接Oracle

    1. 需要oracle的 odbc  jar包 2. 代码 3. 注意:ps对象和statement对象最好用完立即释放,尤其是读写数据库代码出现在 for 循环语句中时. 否则会出现游标不够的情况, ...

  2. Java代码工具箱_用Set给List/Vector去重

    参考 方法一:需要2个容器,1个迭代去重,1个作为结果容器. 此方法其实想法比较简单也是正常思路: package com.yonyou.test; import java.util.List; im ...

  3. Java代码工具箱之控制台输出重定向_控制台输出到文件

    1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...

  4. Java代码工具箱之解析单行单列简单Excel

    1. 使用开源工具 jxl.jar 2. 功能:解析常规Excel.xls格式测试可行,xlsx未测试.Excel测试格式为常规类似table这种简单布局文件.第一行为标题,后面行为内容.代码 可正确 ...

  5. java.sql.SQLException: ORA-01000: 超出打开游标的最大数

    实际上,这个错误的原因,主要还是代码问题引起的.  ora-01000: maximum open cursors exceeded.  表示已经达到一个进程打开的最大游标数.  这样的错误很容易出现 ...

  6. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  7. oracle异常处理——ORA-01000:超出打开游标最大数

    oracle异常处理--ORA-01000:超出打开游标最大数https://www.cnblogs.com/zhaosj/p/4309352.htmlhttps://blog.csdn.net/u0 ...

  8. 21. orcle导出sql脚本时,提示“超出打开游标最大数”

    1.解决办法:修改下打开游标最大数即可 SQL> show parameter open_cursors;NAME                                  TYPE   ...

  9. IntelliJ IDEA,代码行宽度超出限制时自动换行

    转自:http://my.oschina.net/angerbaby/blog/471351 当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能 ...

随机推荐

  1. Mysql实例参数优化15个主要参数讲解(原创)

    1.innodb_buffer_pool_size 设置物理内存的60%-80%,反应IO吞吐的最大上限2.innodb_thread_concurrency 线程并发,设置为CPU核心数,如果等于0 ...

  2. 二次开发php

    AB模板  http://www.adminbuy.cn/ 码源 (站长之家)http://down.chinaz.com/ 易无袖资源 http://www.ewuxiu.com/ A5码源 htt ...

  3. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  4. 非局部均值去噪(NL-means)

    非局部均值(NL-means)是近年来提出的一项新型的去噪技术.该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持图像的细节特征.基本思想是:当前像素的估计值由图像中与它具有相似邻域结构的 ...

  5. 剑指Offer——数组中的逆序对(归并排序的应用)

    蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典 ...

  6. Git把旧仓库的分支拉到新仓库中

    背景:项目新建了个git仓库(B仓库),放改版的新项目,现在运维所有项目构建都是在一个Jenkins里构建,然后拉镜像到相应服务器里,为了不让运维每次构建不同项目需要改git仓库地址,需要把原来项目仓 ...

  7. FIRST集和FOLLOW集,FIRSTVT集和LASTVT集的求法

    学习编译原理时, 这几个集合相信大家并不陌生:FIRST.FOLLOW.FIRSTVT.LASTVT. 其中First和Follow是一对,而Firstvt和Lastvt是一对. 它们的作用分别是: ...

  8. QT学习小demo之LightMD(MarkDown编辑器)

    很早之前就有了写一个类似Windows记事本的想法,加上最近也刚好在学编译原理,所以就想把两者结合起来,于是就打算结合MarkDown,开发一款MarkDown编辑器. 不过由于我之前一直使用的是Ja ...

  9. vs2017 运行所选代码生成器时出错

    [转]https://blog.csdn.net/sunshineyang1205/article/details/80211313 ASPNET MVC Core中像Controller中添加控制器 ...

  10. c/c++技巧总结

    1.bzero().memset()初始化结构体. 2.求结构体分量在结构体中地址偏移量 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) ...