41 Star 100 Fork 127

openGauss/openGauss-connector-jdbc

 / 详情

【测试类型:接口功能】【测试版本:5.1.0】 JDBC进行批量插入时,preparedStatementCacheQueries参数不生效,数据库端cachedplan数据上升较快

已验收
缺陷 成员
创建于  
2023-10-24 17:02

【标题描述】: JDBC进行批量插入时,preparedStatementCacheQueries参数不生效,数据库端cachedplan数据上升较快
【测试类型:SQL功能/存储功能/接口功能/工具功能/性能/并发/压力长稳/故障注入/安全/资料/编码规范】【测试版本:5.1.0】 问题描述: JDBC进行批量插入时,preparedStatementCacheQueries参数不生效,数据库端cachedplan数据上升较快,远大于preparedStatementCacheQueries数量。
【操作系统和硬件信息】(查询命令: cat /etc/system-release, uname -a):
windows
【测试环境】(单机/1主x备x级联备):
单机
【被测功能】:
jdbc批量插入
【测试类型】:
不涉及
【数据库版本】(查询命令: gaussdb -V):
5.1.0 release
【预置条件】:
数据库功能正常。
【操作步骤】(请填写详细的操作步骤):
配置batchMode=OFF&&reWriteBatchInserts=true后,单次插入1000条以上数据:

        Properties props = new Properties();
        props.put("preparedStatementCacheQueries", "2");
        props.put("prepareThreshold", "1");
        props.put("fetchSize", "5");
        props.put("batchMode", "OFF");
        props.put("reWriteBatchedInserts", "true");
        try (Connection conn = TestUtil.openDB(props)) {
            excuteSql(conn, "set session_timeout = 0;");
            excuteSql(conn, "drop table if exists t1");
            excuteSql(conn, "create table t1(id int, id1 int, id2 int, id3 int, id4 int, id5 int, data varchar(2048));");
            String batchInsert = "insert into t1 values (?,?,?,?,?,?,?)";
    ....反复执行批量插入(1000以上/次)
  1. 在此过程中通过下面的语句查看cachedplan数量(application_name需要修改),
    select a.sessid, a.contextname, count() as count from gs_session_memory_detail a left join pg_stat_activity b on regexp_replace(sessid, '^[^.].','') = b.sessionid where b.application_name like '%Driver Tests%' and a.contextname='CachedPlan' group by a.sessid, a.contextname order by 3 desc;
    3.重复1/2步骤,并且访问不同的表,查看cachedplan是否持续上升
    【预期输出】:
    步骤2输出的数量应该接近preparedStatementCacheQueries=2,误差在1以内。
    步骤3:cachedplan数量不会持续上升。
    【实际输出】:
    步骤2输出的cachedplan数量远多于preparedStatementCacheQueries数量
    步骤3:cachedplan数量持续上升
    【原因分析】:
  2. 这个问题的根因
    batchmode为off和开启rewrite后出现过多cacheplan原因已定位,因为此过程会将批量数据按128到1进行分组,如1000按照128分组成7个128 ,1个 64,1个32,1个8共10条sql,这10条语句不进入lru cache管理,单次批量插入所以只会通过java gc释放。默认的10s gc周期内,有多个大于128的批量插入,那么jdbc会向数据库申请对应数量的cachedplan且不受lru cache数量限制;
    解决措施:
  • 开启batchmode,这样批量插入语句不会改写且纳入lru cache管理,使用后那释放
  • batchmode= off但不开启rewrite,这样会增加更多的网络通信开销
  • batchmode= off 开启rewrite,减少gc周期。
  1. 问题推断过程
  2. 还有哪些原因可能造成类似现象
  3. 该问题是否有临时规避措施
  4. 问题解决方案
  5. 预计修复问题时间

【日志信息】(请附上日志文件、截图、coredump信息):

【测试代码】:

评论 (4)

周斌 创建了缺陷 1年前
opengauss_bot 添加了
 
sig/connectors
标签
1年前
周斌 负责人设置为周斌 1年前
周斌 修改了描述 1年前
周斌 修改了描述 1年前
周斌 关联项目设置为openGauss 5.1.1 community 1年前
周斌 修改了备注 1年前
周斌 修改了备注 1年前
周斌 修改了备注 1年前
周斌 任务状态待办的 修改为已确认 1年前
jiexiao1413 任务状态已确认 修改为测试中 1年前
wan005 添加协作者ningyali 1年前

验收版本:
(openGauss 5.1.1 build 01b191f0) compiled at 2023-12-07 15:17:40 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 10.3.0, 64-bit
JDBC:compiled at 2023-12-07-15:34:08 build 4ba7b92
验收结论:验收通过
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明

ningyali 任务状态测试中 修改为已验收 1年前

验收版本:
gaussdb (openGauss 3.0.5 build b09fbaf0) compiled at 2023-12-07 19:02:56 commit 0 last
JDBC:compiled at 2023-12-07-19:12:44 build 033e6cf
验收结论:验收通过
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明
输入图片说明

登录 后才可以发表评论

状态
负责人
项目
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
预计工期 (小时)
开始日期   -   截止日期
-
置顶选项
优先级
是否回合
回合版本
回合自检情况
未设置
确定
提单组织
客户名称
里程碑
分支
组织
组织
确定
故障现象
问题故障现象
确定
用例发现
备注
已清楚原因,但是修复的工作量可能比较大,影响内容也比较多。考虑要转需求。 另外已经联系高欢斌内部解决
确定
开发领域
开发改进-改进措施
开发改进-改进措施
确定
开发改进-输出件归档
开发改进-输出件归档
确定
故障概率
开发是否复现
测试领域
测试责任人
测试责任人
子特性
问题归属自特性
确定
问题详情
问题原因详情
确定
需求引入问题
是填需求ISSUE ID;其他填否
确定
转测后遗漏问题
是否分析
关键日志
问题定位关键日志
确定
问题引入阶段
问题出现阶段
问题引入版本
测试是否复现
问题发生分类
测试改进-改进措施
测试改进措施
确定
测试改进-输出件归档
测试改进输出件归档
确定
参与者(3)
13084139 opengauss bot 1686829535 8772917 ningyali 1691032793 周斌-justbk
Java
1
https://gitee.com/opengauss/openGauss-connector-jdbc.git
git@gitee.com:opengauss/openGauss-connector-jdbc.git
opengauss
openGauss-connector-jdbc
openGauss-connector-jdbc

搜索帮助