注册
句柄数问题
专栏/培训园地/ 文章详情 /

句柄数问题

拔丝地瓜 2024/04/10 1330 0 0
摘要

1 问题描述
推送数据前台报错:“语句句柄个数超上限或系统内存不足”

2 原因分析
系统层排查:
2.1、系统内存:
image.png

2.2、资源限制
image.png

2.3、根据数据库实例的PID进程查询使用的文件数
image.png
image.png

3 数据库层:
3.1、 查询数据库配置
最大连接数MAX_SESSIONS
单个会话最大句柄数MAX_SESSION_STATEMENT
image.png

3.2、数据库当前连接数:
image.png
3.3、查询句柄数
select sess_id,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 order by 使用的句柄数 desc ;
image.png

3.4、统计句柄数
select session#,count(stmt_id) from v$open_stmt group by session# order by 2 desc;
image.png

4 问题复现
开发排查sql拼接的问题导致,数据库层发现的sql:
SELECT taxpayerid FROM bd_customer WHERE pk_financeorg = ? AND dr='0'

5 解决方案
临时解决方案,将句柄数超过两万的sql kill掉
sp_close_session(会话);

最终解决方案:
应用开发人员提供的原始程序:语句个数超量,数据量多的时候,在逻辑里面加一层数据库连接完,关闭连接的操作,问题解决;
String updateInvoiceSuccessData = "SELECT DEF9 FROM sscivm_invoice

  • "WHERE pk_invoice = ? AND dr='0' ";
    Connection conn= DbUtil.getConn();
    PreparedStatement pstm = conn.prepareStatement(updateInvoiceSuccessData);
    pstm.setString(1,pk_invoice);
    ResultSet rs = pstm.executeQuery();
    String DEF9=null;
    while(rs.next()) {
    DEF9 = rs.getString("DEF9");
    }
    rs.close();
    pstm.close();
    conn.close();
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服