【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发
问题现象
某客户使用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的使用场景;
灵活使用辅助表来验证触发器的触发次数。
【YashanDB知识库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发的更多相关文章
- jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程
一. java.sql.* 和 javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...
- jdbc java数据库连接 2)jdbc接口核心的API
JDBC接口核心的API java.sql.* 和 javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- JDBC 接口学习
说明:文章所有内容皆选自实验楼教程[JDBC 入门教程],想要学习更多JDBC,可以点击教程进行学习~ JDBC 简介 JDBC 的全称是 Java Database Connectivity,叫做 ...
- 用JDBC编程的执行时错误及其解决大全
用JDBC编程的执行时错误及其解决 用JDBC编程的执行时错误及其解决 源码: .java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlser ...
- JDBC接口
Jmeter实例8:JDBC接口 加线程组.加JDBC配置信息: 配置信息详情如下:默认展示值不用修改 必填信息: Database UR:固定格式,将IP.端口号.数据库名修改成自己要用的数据库信息 ...
- jdbc 接口的用法 Statement和PreparedStatement的区别!
package cn.zhouzhou; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Resu ...
- jdbc接口api
java.sql.* 和 javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, properties): ...
- JDBC批量运行executeBatch
JDBC运行SQL语句,有两个处理的接口,一个PreparedStatement,Statement,一般操作JDBC比較用得多的还是PreparedStatement 只是在运行批量,Prepare ...
- 关于JDBC的批量操作executeBatch()所引发sql语句异常
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that correspon ...
随机推荐
- ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”
问题: 在将 use_sim_timer 置为 true 时,节点 Timer_Callback 行为 "异常" .在回调函数中,使用 self.get_logger().info ...
- SpringBoot排查自动装配、Bean、Component、Configuration配置类
排除自动装配AutoConfiguration @SpringBootApplication( exclude = { DataSourceAutoConfiguration.class, Mybat ...
- Windows下git配合Unity要设置autocrlf=false
Unity的.asset文件的换行符一定是Unix (LF)格式的,哪怕在设置里选了用Windows (CRLF)也没用,这个选项只对创建的C# Script有效. 这些Unix换行文件提交上去没问题 ...
- [oeasy]python0012_字符_character_chr函数_根据序号得到字符
字符(character) 回忆上次内容 上次了解了ord函数 这个函数可以通过字符得到序号 那么可以反过来吗? 通过序号得到字符可以吗? 编辑 ord的逆运算chr 有来就有回 编辑 好 ...
- Excel VBA编程常用语句300句
定制模块行为 1. Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Opt ...
- holiday week 1
本周进度总结: JAVA javafx以安装完毕并完成了环境配置 因处于小学期中java暂时搁置学习 自学了部分链表.多线程以及一些C/C++的知识,对部分C++库有了更进一步了解 因多线程的问题将平 ...
- 文件系统(十一):Linux Squashfs只读文件系统介绍
liwen01 2024.07.21 前言 嵌入式Linux系统中,squashfs文件系统使用非常广泛.它主要的特性是只读,文件压缩比例高.对于flash空间紧张的系统,可以将一些不需要修改的资源打 ...
- Mysql函数12-DATE_FORMAT
DATE_FORMAT函数用于日期格式的转换. 1.sql查询出一列create_time select create_time from goods where id=65 2.让create_ti ...
- 【Vue】Vue-Cli 安装
首先需要Node.js环境支持: Node.js官网下载: https://nodejs.org/en/ 右边稳定版,左边最新版 下载安装程序之后双击运行,无脑下一步 打开终端输入版本查看命令: no ...
- 《Python数据可视化之matplotlib实践》 源码 第四篇 扩展 第十三章
图 13.10 import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np mpl.rcParams[&q ...