句柄与对象创建的个数有关
在数据库插入过程中出现如下报错:

此时jdbc的日志为

其中句柄数pstmt-200 达到200个,连接数conn-1只有一个
此时相关参数为:
MAX_SESSIONS = 100#最大会话数
MAX_SESSION_STATEMENT = 200#一个会话最大的句柄数
可以通过调大MAX_SESSION_STATEMENT参数暂时解决问题,但无法从根本上解决问题。
可以使用查看连接会话的句柄使用情况

select sql_text,state,n_stmt  "句柄的容量",n_used_stmt as "使用的句柄数",curr_sch,user_name,trx_id,create_time,clnt_type,clnt_ip,run_status from v$sessions;

程序插入代码为

在代码可以看到在for循环中除参数的传递之外还有一个
prest = con.prepareStatement(sql1);
寻其源码:

有这样的解释,通过传入含有占位符的sql语句返回PreparedStatement对象,通过对PreparedStatement的操作进而转化为为对数据库的操作,在这个对象类中的方法我们可以看到如此多的方法,这些方法提供了占位符转化为指定参数的等功能

addBatch
将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。通过调用方法 executeBatch 可以批量执行此列表中的命令。
executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
通过以上的分析我将代码改写为

使得每次循环时不将会创建预编译的 SQL 语句的对象,这样便避免的句柄的增加
解决问题
附件:
1.实体类

package dm_02;import java.io.InputStream;
import java.io.StringReader;/**
* @类名  Testyy1.java
* @作者  li2025
* @版本  V1.0
* @日期  2020年6月30日-下午3:10:19
* @描述
*
*/
public class Testyy1 {private int C1=1;private String C2;private Double C3;private long C4;private StringReader C5;private InputStream C6;public Testyy1() {super();// TODO Auto-generated constructor stub}public Testyy1(int c1, String c2, Double c3, long c4, StringReader c5, InputStream c6) {super();C1 = c1;C2 = c2;C3 = c3;C4 = c4;C5 = c5;C6 = c6;}public int getC1() {return C1;}public void setC1(int c1) {C1 = c1;}public String getC2() {return C2;}public void setC2(String c2) {C2 = c2;}public Double getC3() {return C3;}public void setC3(Double c3) {C3 = c3;}public long getC4() {return C4;}public void setC4(long c4) {C4 = c4;}public StringReader getC5() {return C5;}public void setC5(StringReader c5) {C5 = c5;}public InputStream getC6() {return C6;}public void setC6(InputStream c6) {C6 = c6;}}

2.Conect配置

package dm_02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class Conn {Connection con=null;public Connection getConn(){String cname="dm.jdbc.driver.DmDriver";String url="jdbc:dm://127.0.0.1:5236?logDir=E:\\big_date\\DM&logLevel=all";//DM7的端口号为5236String userid="SYSDBA";String pwd="SYSDBA";try{Class.forName(cname);con=DriverManager.getConnection(url,userid,pwd);System.out.println();}catch(Exception e){System.out.println("数据库连接失败:"+e.getMessage());}return con;}public void disConn() throws SQLException{if(con!=null){con.close();}}
}

3.方法类

package dm_02;
import java.io.*;
import java.sql.*;
import java.util.Date;public class Stmt {Connection con=null;Statement stmt=null;ResultSet rs=null;PreparedStatement prest=null;Conn connect=new Conn();int m=20;//测试建表public void stmt_create() throws SQLException, FileNotFoundException{String sql1_d = "drop table TESTYYL;";String sql1 = "create table TESTYYL(C1 int,C2 VARCHAR(100),C3 number(10,2),C4 timestamp,C5 clob,C6 blob);";con = connect.getConn();stmt = con.createStatement();try {stmt.executeUpdate(sql1);} catch (SQLException e) {// 表已存在则创建失败,删除表并重新创建stmt.executeUpdate(sql1_d);stmt.executeUpdate(sql1);}System.out.println("建表成功成功!");stmt.close();con.close();connect.disConn();}//循环插入10条记录public void stmt_insert() throws SQLException, FileNotFoundException{String sql1 = "insert into testyyl values(?,?,?,?,?,?);";con = connect.getConn();Statement stmt=con.createStatement();con.setAutoCommit(false);prest = con.prepareStatement(sql1);int i = 0;int j=12222;String str = "达梦数据库";  File  file  =  new  File("test_info\\pic.jpg");             long t = System.nanoTime();// 获取当期时间,单位为纳秒Testyy1[] testyy1s=new Testyy1[m];for (i = 0; i < m; i++) {StringReader vclob = new StringReader(str); InputStream  vblob  =  new  FileInputStream(file);  testyy1s[i]=new Testyy1(j++, "wuhandameng", Math.random(), new Date().getTime(), vclob, vblob);}for (i = 1; i <= m; i++) {//prest = con.prepareStatement(sql1);prest.setInt(1, testyy1s[i-1].getC1());prest.setString(2, testyy1s[i-1].getC2());prest.setDouble(3, testyy1s[i-1].getC3());prest.setTimestamp(4, new java.sql.Timestamp(testyy1s[i-1].getC4()));prest.setClob(5,testyy1s[i-1].getC5() );   //也可以直接用prest.SetString("达梦数据库");prest.setBlob(6, testyy1s[i-1].getC6());prest.addBatch();}prest.executeBatch();con.commit();t = (System.nanoTime() - t) / 1000000;System.out.println("插入" + (i - 1) + "行记录耗时:" + t + "毫秒");stmt.close();con.close();connect.disConn();}//删除public void stmt_delete() throws SQLException, FileNotFoundException{String sql1="delete from testyyl where c1=? and c2=?";con=connect.getConn();con.setAutoCommit(false);prest=con.prepareStatement(sql1);int i = 0;for(i = 1; i <= m; i++){prest.setInt(1, i);prest.setString(2, "wuhandameng");prest.addBatch();//prest.executeBatch();}prest.executeBatch();con.commit();System.out.println("删除"+(i-1)+"条记录成功!");prest.close();con.close();connect.disConn();}public void stmt_select() throws SQLException, FileNotFoundException{String sql1="select * from testyyl;";con=connect.getConn();Statement stmt=con.createStatement();ResultSet rs1=stmt.executeQuery(sql1);while(rs1.next()){System.out.println(rs1.getInt(1)+","+rs1.getString(2)+","+rs1.getDouble(3)+","+rs1.getTimestamp(4)+","+rs1.getString(5)+","+   //rs1.getClob(5)rs1.getBlob(6)         //rs1.getBytes(6));}rs1.close();stmt.close();con.close();connect.disConn();}
}

4.main入口

package dm_02;
public class Dm_Demo {public static void main(String[] args) throws Exception{Stmt st1=new Stmt();//st1.stmt_delete();//st1.stmt_create();st1.stmt_insert();//st1.stmt_select();//st1.stmt_delete();//st1.stmt_select();}
}

更多资讯请上达梦技术社区了解: https://eco.dameng.com

达梦数据库语句句柄个数超上限或系统内存不足相关推荐

  1. 达梦数据库安装与初始化超详细教程

    陈老老老板

  2. DM8达梦数据库:系统中的错误码信息

    此达梦数据库版本为:dm8-1-88-20.06.24-123627-ENT SELECT * FROM SYS."V$ERR_INFO"; 错误码: 100 空结果集 101 字 ...

  3. 达梦数据库-8 错误代码查询

    达梦数据库中有一个视图,可以查看目前达梦数据库中所有的报错信息 select * from v$err_info; 可以看到达梦报错代码是从100开始的,截止到目前一共有2799个. CODE ERR ...

  4. DM error code 达梦数据库-错误代码 汇总

    CODE ERRINFO 100 空结果集 101 字符串截断 102 在集函数中计算NULL值 103 无效的表名 104 删除0行记录 105 插入0行记录 106 更新0行记录 107 跨语句游 ...

  5. 达梦数据库操作记录_达梦数据库常用功能及命令记录 -- 持续更新

    达梦数据库常用功能及命令记录 -- 持续更新 达梦数据库常用功能及命令记录 达梦数据库语句的使用总体来说跟 oracle 很接近的, 这篇文章主要是把常用的情况和语句做了记录, 并且后续还会不断的持续 ...

  6. 达梦数据库DM的知识总结---DCA

    达梦数据库是类似于Oracle的一款国产数据库,在诸多政府和企业单位被应用.其绝大部分的逻辑结构和操作语言都与Oracle类似. 达梦的官网和社区网站是不一样的.达梦的社区网站:https://eco ...

  7. 查看达梦数据库表中的数据为乱码解决

    将数据库备份文件导入达梦数据库后,从windows启动应用系统,查看表中的数据时,表中的中文全部显示为乱码. 解决方法: 在目录C:\Windows\System32下创建文件dm_svc.txt,使 ...

  8. oracle数据库查询open_cursors值的sql语句,达梦数据库查询MAX_SESSION_STATEMENT值方法,MAX_SESSION_STATEMENT的最大值、上限是多少

    windows 下需要用 cmd 登录 oracle 数据库,用 show parameter open_cursors 来查询. 可以看到 open_cursors 的值为 2000. SQL> ...

  9. 达梦数据库修改字段(列)(基表修改语句)

    2019独角兽企业重金招聘Python工程师标准>>> 达梦数据库提供基表修改语句,对基表的结构进行全面的修改,包括修改基表名.列名.增加列.删除列.修改列类型.增加表级约束.删除表 ...

  10. 达梦数据库执行sql语句时报错:表【xxx】中不能同时包含聚集KEY和大字段

    最近在部署测试搭配达梦数据库的应用,使用sql语句创建表并插入数据时,有出现如下错误:表[xxx]中不能同时包含聚集KEY和大字段,如下图所示: 问题原因:达梦数据库建表时默认将主键设置为聚集索引,而 ...

最新文章

  1. JAVA入门级教学之(final关键字)
  2. Python爬虫之Cookie和Session(转载)
  3. window添加右键菜单
  4. C# 让应用程序只运行一个实例
  5. kafka搭建、学习(一)
  6. 深入理解Servlet原理
  7. 金蝶BOS自定义元数据
  8. Moonstarter IDO 一步一步的操作
  9. html背景斜线,巧妙的实现 CSS 斜线(炫酷的小效果)
  10. 网易互娱笔试题(2021春招)
  11. 华为A1路由器虚拟服务器,华为a1路由器怎么用手机设置DMZ主机
  12. 第28届奥运会奖牌榜
  13. HTTP 重定向状态码是什么意思?
  14. python学习第八天
  15. 【剑指Offer】不用加减乘除做加法(异或:无进位的和 + 相与并左移1位:进位和)
  16. 【Android开发】 获取手机上的各种apk的包名和类名,实现跳转到其他应用
  17. CRM系统线索转商机分配归属人失败解决方法
  18. web期末实验 自选 京东网站
  19. 3D游戏设计读书笔记七
  20. 外星人dl踩坑记01——双系统

热门文章

  1. ios怎么ftp上传文件到服务器,Mac OS通过 FTP工具上传文件的方法
  2. Java针对不同文件加水印
  3. D-Link 智能家居新品将登陆苹果中国官网
  4. Word2010中插入多级列表编号将默认标题样式变成多级编号
  5. 三.minio 的分布式部署、单节点多磁盘、多节点模式
  6. firefox linux 关闭,Firefox 的 Flash 被禁用的解决方法
  7. fisher判别分析原理+python实现
  8. 计算机书籍排版抓图要求,计算机录入与排版
  9. python实现多接口翻译软件
  10. 注册苹果开发者账号遇到问题汇总