GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1590

修改后就没报错了

还是 chongqingdaxue 缴费平台, 税票打印完毕, 上传到财务处时, 当税票数目较少时(10几张), 能正常上传; 当数目较大时(共408张), 就上传失败. 查看 tomcat 日志, 如下:

既然超出最大游标数, 为了第一间让程序恢复正常运行, 当然"脚疼治脚", 先把最大游标数调大:
(1). 以 DBA 登录 PL/SQL
(2). 打开 Command Window(注意不是 SQL Window)

(3). 输入以下命令, 修改 oracle 最大游标数为 1000
SQL> alter system set open_cursors=1000 scope=both;
(4). 查看最大游标数是否已修改成功
SQL> show parameter open_cursors;
(5). 重启 tomcat(一定要有这一步, 否则修改不生效)

经过以上操作, 票据顺利上传上去了, 可是这样治标不治本, 万一以后来个1000张以上的票据要上传, 那不就又得改游标数了; 在代码里肯定是每处理一张票就打开一个游标的, 这样是错误的. 网上找了这个错误代码的相关说明, 在这里发现以下这段话
这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

在代码里看了一下, 果然是这样, 程序通过循环调用封装好的 executeSql 函数, 来对每张票进行 update, 而 executeSql 里每次都调用了 conn.prepareStatement(); 将其移出循环, 再改回原游标数, 再上传票据, 就不再报错了.
public static void executeSql(Connection conn, String sql, Object[] parValue) throws Exception{
PreparedStatement ps = null;
try {
LOGGER.info(sql);
ps = conn.prepareStatement(sql);
if (parValue != null){
String params = “”;
for (int i = 0; i < parValue.length; i++){
if (i != 0){
params += “,”;
}
ps.setObject(i+1, parValue[i]);
params += parValue[i];
}
LOGGER.info(params);
}
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
throw new Exception();
} finally {
if (ps != null){
ps.close();
}
}
}
注: 原代码有进行 ps.close(); 的, 但是仍然无效, 是因为 connection 的 autocommit 设为 false 的原因? 还是因为 connection 是从连接池取的原因呢?
这里有一个问题说明 connection 与 prepareStatement 进行 close 的关系, 但这里只是说明了直接 close connection, 而没有说明直接 close prepareStatement.
问:
用CONNECTION 创建了 PREPAREDSTATEMENT ,用完了 PREPAREDSTATEMENT 后,没有关闭PREPAREDSTATEMENT ,而是直接 CLOSE CONNECTION ,这么做有什么隐患吗?
答:
如果没有使用数据库连接池,而是每次创建物理连接,然后释放的话,没有什么问题。close Connection的时候已经把数据库资源完全释放掉了,PreparedStatement占用的数据库游标也会随即释放。 但是大部分情况读写数据库都会采用数据库连接池来提高连接效率,在这种情况下有潜在的隐患。 因为数据库连接池中拿到一个Connection,close的时候不是真正关闭连接,释放数据库资源,而是把连接归还给连接池。因此在这种情况下,close了Connection,但是PreparedStatement并没有被释放掉,占用的数据库游标仍然处于打开状态。因此在大数据访问量的情况下很容易出现数据库游标使用到最大,无法分配游标错误。

环境: Oracle 10g

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1590

ORA-01000-超出打开游标的最大数(解决及原因)相关推荐

  1. Java 技术篇 - 连接oracle数据库执行sql使用close()关闭createStatement()无效无法清除游标缓存问题解决,报“ORA-01000: 超出打开游标的最大数“错误解决方法

    java.sql.SQLException: ORA-01000: 超出打开游标的最大数 问题在一个大数据量的嵌套循环下 close() 关闭 createStatement() 根本无效,即使把执行 ...

  2. ORA-01000: 超出打开游标的最大数

    当使用JDBC操作数据时出现起出打开游标最大数的原因:一般出现在执行大量插入语句 时,没有关闭Statement. 解决方法:每次插入一条数据时或找执行一次批量提交时,记得 stmt = conn.c ...

  3. Java oracle 超出打开游标的最大数

    Java代码在执行conn.createStatement和conn.prepareStatement时候实际上都是相当和在数据库中打开了个cursor 不要放在这两个方法不要放在循环中 java.s ...

  4. -00020 ora_ORA-00020 超出最大进程数的解决方法

    ORA-00020 超出最大进程数的解决方法 1 原因: 一般原因是因为你的应用程序的连接数超过了 ORACLE 系统设置的最大连接数. 2 解决方法: ⑴方法一: 修改初始化参数. ⑵方法二: 使用 ...

  5. oracle年份超出范围,ora-00020超出最大进程数的解决方法

    ora-00020超出最大进程数的解决方法 一般原因是因为你的应用程序的连接数超过了ORACLE系统设置的最大连接数.你可以到ORACLE的OEM下,用SYS as/sysdba进入OEM,在Inst ...

  6. html不能超出div的宽度,DIV设置width后超出父元素应该如何解决

    这次给大家带来DIV设置width后超出父元素应该如何解决,解决DIV设置width后超出父元素的注意事项有哪些,下面就是实战案例,一起来看一下. 前言 本文介绍的是利用CSS3的新属性box-siz ...

  7. 关于Qt Designer程序/UI文件打开未响应的解决方法

    关于Qt Designer程序/UI文件打开未响应的解决方法 参考文章: (1)关于Qt Designer程序/UI文件打开未响应的解决方法 (2)https://www.cnblogs.com/ys ...

  8. Chrome浏览器打开异常慢的解决办法

    Chrome浏览器打开异常慢的解决办法 参考文章: (1)Chrome浏览器打开异常慢的解决办法 (2)https://www.cnblogs.com/Cate-Hunter/p/10856919.h ...

  9. (DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法

    (DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法 参考文章: (1)(DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法 (2)https://www.cnblogs.com/ka ...

最新文章

  1. Android Opengl
  2. 3.8 Softmax 回归-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. tomcat7+nginx+memcached 配置tomcat 集群以及负载均衡
  4. react 最佳实践_最佳React教程
  5. Rust核心团队前成员Brian Anderson加入PingCAP
  6. java2实用教程知识点_Java2实用教程(第5版)重要点及遗漏点(三)
  7. 服务器虚拟化性能,企业级服务器虚拟化性能评估方法
  8. submit和button的区别
  9. xposed 入门之修改手机 IMEI
  10. 第三讲:验证码点击刷新
  11. 【c语言】malloc函数详解
  12. FANUC 工业机器人编程与联网
  13. 高等数学(下)思维导图
  14. 侍魂微信新服务器2019,侍魂胧月传说手游2019年5月14日微信问答试炼答案
  15. 计算机显示器画画的清晰度,如何设置显示器分辨率让画面更清晰
  16. 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录
  17. 【Flutter从入门到实战】⑪、豆瓣案例-1、星星评分Widget、虚线Widget、TabbarWidget、BottomNavigationBarItem的封装、初始化配置抽取
  18. [转]静态框架导航,左侧折叠树的样式,类似于treeview
  19. 学Python最基本20个代码__1
  20. 用 JavaScript 对 JSON 进行模式匹配 (Part 1 - 设计)

热门文章

  1. php实现服务器访问统计,服务器端统计网站总访问人数
  2. python爬取pdf教程_#如何利用Python抓取PDF中的某些内容#python爬取pdf教程
  3. 软件设计师-计算机网络(刷题笔记)
  4. PHP网页文件扩展名,网页文件的扩展名有哪些
  5. LeetCode. 拿硬币
  6. WPS格式的文件如何转换为word格式
  7. ▼ 系列 | 漫谈数仓第四篇NO.4 『BI选型』
  8. 关于归并排序时间复杂度 T(n) =2T(n/2)+O(n)
  9. MPEG-7描述子(0)——颜色空间
  10. A Survey on Deep Learning Techniques for Stereo-based Depth Estimation论文阅读