ITPub博客

首页 > 数据库 > Oracle > 【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发

【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发

原创 Oracle 作者:崖山数据库系统YashanDB 时间:2024-08-05 16:28:30 0 删除 编辑

问题现象

某客户使用jdbc接口向yashandb的表A插入数据。

表A上有一个语句级触发器,其内容为在触发时执行alter sequence操作;另外还有一个insert时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自sequence.nextval,要么来自于current_timestamp。

客户向表A插入90万条数据大概要花费两个半小时。

问题的风险及影响

表中插入数据慢,影响客户系统的处理效率。

问题影响的版本

22.2.14.100及以前的所有版本

23.2.1.100及以前的所有版本

问题发生原因

yashandb的代码bug,批量执行循环调用anlExecuteSingle,会多次触发语句级触发器

解决方法及规避方式

版本层面通过修改代码解决。

规避方式不使用语句级触发器

问题分析和处理过程

使用如下的ddl来验证语句级触发器被触发了多少次:

drop table trig_test;
create table trig_test(t1 number,t2 number);drop table flag;
create table flag(t number);
create or replace trigger trig_01
before insert or update on trig_test
begin
  insert into flag values(1);
end;
/

使用如下的java代码来触发:

//代码占位符
public static void main(String[]args){
    try(Connection conn = DBUtil.getConn()){
        conn.setAutoCommit(false);
        PreparedStatement ps = conn.prepareStatement("insert into trig_test(t1) values(?)");
        for(int i = 0; i < 100; i++){
            ps.setInt(1,i);
            ps.addBatch();
        }
        ps.executeBatch();
        conn.commit();
    }catch (Exception e){
        e.printStackTrace();
    }
}

java代码执行完成后,查看flag表中的总数据量,就可以知道触发器被触发了多少次。yashandb的实际结果:

可以看到,语句级触发器被触发了100次,这是不合理的。

经验总结

了解客户对jdbc的使用场景;

灵活使用辅助表来验证触发器的触发次数。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3024219/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据管理解决方案。

注册时间:2023-04-11

  • 博文量
    722
  • 访问量
    639734