详细介绍:记一次达梦数据库的查询异常

news/2025/10/24 17:52:44/文章来源:https://www.cnblogs.com/tlnshuju/p/19163966

详细介绍:记一次达梦数据库的查询异常

2025-10-24 17:52  tlnshuju  阅读(0)  评论(0)    收藏  举报

项目使用的国产达梦数据库。不得不说达梦数据库网上的资料真的是少啊!遇到问题都不知道怎么搞。

表象:

1. 启动项目后,第一次使用17当做参数查询数据正常,总条数=10,使用16作为参数查询,结果正常,总条数=0。 再使用17当做参数查询,结果异常,总条数=0。

首先copy了他的数据库,本地进行复现,失败

视图创建语句,一模一样,
视图依赖的表的建表语句,基本一致,
STORAGE(ON "FAWKES", CLUSTERBTR)
STORAGE(ON "MAIN", CLUSTERBTR) ;
先放弃本地复现。

补充:本地环境和线上环境,数据库版本不一致。本地 (0x7000d)    线上 (0x7000c)

链接服务器进行问题复现

查询17,总条数=10,
查询16,总条数=0,
查询17,总条数=0,(异常)
copy出来语句,直接使用navicat执行,总条数=10.
通过python脚本等其他方式执行,总条数=10.

首先怀疑是视图的问题

dm项目中使用场景很多,如果正常的对象mapper出现问题服务早宕了。将视图中对应的这条数据copy到mapper中,直接使用mappper执行,没有问题。重复多次执行数据正常。
问题出现在视图上。

更正: 当时只copy了unin的最后一个表,后期copy了整个视图执行也是异常。

怀疑我们项目的问题

我们项目对接了10多种数据库,对mybatis的拦截器等进行过各种封装。怀疑参数拼接存在问题。
启动一个新的空的项目,只引入mybatisPlus, 进行验证。(排除我们项目自己拦截器的问题)
空项目的demo中,mybatis验证异常,查询17=10条,16=0条,17=0条。

怀疑mybatis和dm的问题

直接使用手撸jdbc进行验证。直接使用拼接完成的sql验证,数据正常,
使用?占位符验证, 数据正常???(这个地方搞错了

手撸jdbcTemplate正常,mybatis不正常。

问题是否出现在参数拼接上?MybatisParameterHandler#setParameters,跟这个这个类看看参数拼接,数据拼接方式一致,执行语句一致,麻了我,mybatis底层也是PreparedStatement,手撸代码也是PreparedStatement,咋执行结果还是不一样呢?

不能太相信自己的眼睛,copy出来用对比工具比对一下各个参数。嗯?我错误的把英文占位符写成了中文的占位符。dm自己有优化,支持中文占位符。所以我的中文占位符数据正常。退回到上一步,验证英文占位符查询结果,结果异常,17=10条,16=0条,17=0条。

其它错误,调整参数顺序,因为条件有多个((()))嵌套,去掉一组括号后,数据正常,但是去掉括号后忘了用16进行查询,导致了分析方向被误导到嵌套括号上,又浪费了我大把的生命。

怀疑dm的jdbc有问题

使用python来进行sql的验证。
使用英文占位符?查询失败,17=0条,16=0条,17=0条。
尝试使用中文占位符,结果异常,17=10条,16=0条,17=0条。
python进行查询异常,jdbc进行查询也是异常,排除jdbc的问题。最终问题肯定出现在dm数据库的视图查询上。

疑问再次梳理。

使用navicat一直正常,
使用拼接好的sql一直正常,
使用普通的表是正常的,视图才会出现异常。
复杂的查询,比如视图,比如多张表union all 等容易出现异常
重建视图后第一次查询正常,第二次查询其他数据后,再次查询出现异常。
使用占位符jdbc和dmPython都是异常的,问题出现在复杂查询和占位符和缓存上。

执行计划缓存

查询执行计划,并且清理所有执行计划(线上环境慎用全部清理)。

-- 查看执行计划:0:关闭,1:启用,2:不包含显式参数优化,3:有显式参数也优化
select PARA_NAME,PARA_VALUE from v$dm_ini where para_name like 'USE_PLN_POOL';
-- 定位问题SQL的缓存项:执行以下SQL,替换'%你的SQL特征%'为能唯一标识你问题SQL的字符串片段。
select cache_item, sqlstr from v$cachepln where sqlstr like '%你的SQL特征%';
-- 清除特定的执行计划缓存:使用上一步查询得到的cache_item值来清除缓存。
call SP_CLEAR_PLAN_CACHE(这里替换为具体的cache_item值);

使用jdbc占位符查询视图,17=10条,16=0条,17=0条,清理执行计划,17=10条。
不能每次都跟屁股后面手动清理执行计划吧!添加HINT `/*+ USE_PLN_POOL(0) */ `。
我的jdbc使用了USE_PLN_POOL(0) 不生效,dmpython也不生效,看网上有说能生效的。

待解决问题

USE_PLN_POOL(0) 不生效,问题待定位解决
如何在拦截器中识别当前为dm的视图,并且添加USE_PLN_POOL=0,或其他链接参数方式进行指定不使用执行计划。
本地环境执行结果正常,线上环境执行结果异常问题定位。
优化视图构建,解决执行计划异常问题。

简化后的查询语句

SELECT'16' AS categoryId
FROMdual UNION ALL
SELECT'11' AS categoryId
FROMdual UNION ALL
SELECT'17' AS categoryId
FROMdual

jdbc代码示例:

    @Testvoid test() {String sql = "SELECT  * FROM (  SELECT '16' AS  categoryId FROM dual UNION  ALL  SELECT '11' AS  categoryId FROM dual UNION  ALL  SELECT '17' AS  categoryId FROM dual) WHERE categoryId = ? ";for (String param : Arrays.asList("17", "1", "17")) {try (Connection connection = dataSource.getConnection();PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, param);boolean execute = preparedStatement.execute();try (ResultSet resultSet = preparedStatement.getResultSet();) {System.out.println("执行sql:" + sql);System.out.println("参数1:" + param);System.out.println("查询结果:" + execute + ":" + resultSetToList(resultSet));System.out.println("-----");}} catch (SQLException e) {e.printStackTrace();}}}

执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从价值直觉到价值理性:AI元人文演进路径解读

从价值直觉到价值理性:AI元人文的演进之路 当前人工智能发展面临一个关键挑战:大语言模型虽展现出卓越能力,但其价值响应模式仍建立在简单的参数化基础之上。本文旨在系统阐述AI元人文构想如何引领人工智能实现从价…

【LTDC】在 RGBLCD 屏上实现任意位置画点和读点

前言 此篇文章仅作笔记分享,内容来源为:【正点原子】全是干货 | 手把手教你学STM32的LTDC这篇文章的目的就是熟悉在 RGBLCD 上的绘图操作,了解如何往显存中对应的位置写数据。 绘图实质由于我们的屏幕是 ATK 4.3 80…

2025年阳台壁挂太阳能厂家权威推荐榜单:分体式阳台太阳能/阳台壁挂太阳能热水器/分体式阳台太阳能源头厂家精选

在绿色能源革命席卷全球的今天,阳台壁挂太阳能正以其空间利用率高、安装便捷的优势,成为城市家庭清洁能源解决方案的新宠。 随着城市化进程加快和环保意识增强,阳台壁挂太阳能市场正迎来爆发式增长。根据QYResearch…

使用C# 控制ethercat从站设备

C#通过SOEM+Leal.Core.Net.EtherCAT开发EtherCAT主站 https://www.claves.cn/archives/9651 C# 通过EtherCAT 控制伺服电机(无需板卡或PLC) https://blog.csdn.net/qq_39502959/article/details/145719484QQ群:674210…

0273-GRPC-tonic 进行编解码

环境Time 2022-12-11 WSL-Ubuntu 22.04 tonic 0.8前言 说明 参考:https://github.com/hyperium/tonic/tree/master/examples/src/helloworld 目标 使用 tonic 来处理 protobuf 编码和解码。 user.proto 文件 syntax =…

0271-GRPC-prost 带长度的编解码

环境Time 2022-12-10 WSL-Ubuntu 22.04 prost 0.11前言 说明 参考:https://docs.rs/prost-build/latest/prost_build/ 目标 在前一节的基础上,使用 prost 进行带长度的编解码。 user.proto 文件 syntax = "prot…

2025 年坡口机源头厂家最新推荐排行榜:欧盟 CE 认证企业领衔,含 15 年工业服务经验品牌,自走式/自动/板材/管道坡口机厂家推荐

引言 为解决工业制造企业选购坡口机时面临的品牌筛选难、品质无保障等问题,中国机械工业金属切削工具协会联合行业权威检测机构,开展了 2025 年度坡口机源头厂家测评工作。本次测评覆盖全国 32 个省市共 89 家坡口机…

0270-GRPC-使用 prost 解码

环境Time 2022-12-10 WSL-Ubuntu 22.04 prost 0.11前言 说明 参考:https://docs.rs/prost-build/latest/prost_build/ 目标 在前一节的基础上,使用 prost 进行解码。 user.proto 文件 syntax = "proto3"; …

完整教程:Java开发者进阶之路

完整教程:Java开发者进阶之路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

python+request+unittest自动化测试

python+request+unittest自动化测试 案例:第一种方法,执行全部的用例 import unittest import requests class Cms(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.s=requests.Session(…

国标GB28181平台EasyGBS视频调阅效果在跨域安防监控中的核心应用

国标GB28181平台EasyGBS视频调阅效果在跨域安防监控中的核心应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025 年保温涂料厂家最新推荐排行榜:聚焦技术专利与管理体系认证的优质品牌耐高温/防火耐热/防腐/纳米介孔微珠中空粒子保温涂料公司推荐

引言 在工业升级与建筑节能需求日益增长的当下,保温涂料作为关键节能材料,市场需求持续攀升,但行业乱象却给用户选购带来极大困扰。部分供应商缺乏核心技术,产品保温性能差、耐久性不足,导致用户能耗过高、频繁更…

实战练习:小软件页面间跳转传值 子页面数据渲染

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年云南独立成团游公司权威推荐榜单:云南旅游团/云南私享之旅/云南专属行程游源头公司精选

面对云南旅游市场个性化需求的爆发式增长,独立成团服务正成为品质旅行者的首选。 据最新行业数据显示,2025年云南旅游市场中,6人以下精品小团需求同比增长175%,私密性、灵活性与深度体验成为游客的核心关注点。 在…

2025 年气凝胶生产厂家最新推荐排行榜:含气凝胶毡 / 粉 / 隔热板 / 保温罩 / 陶瓷板品牌,优质厂家推荐

引言 在环保节能与智能化技术飞速发展的当下,气凝胶作为纳米绝热保温材料的核心品类,在钢铁、焦化、化工等领域需求激增。为帮助企业精准筛选合作伙伴,中国绝热节能材料协会联合行业专家开展 2025 年度气凝胶厂家测…

2025年5.5KW工业吸尘器厂家权威推荐榜单:380V防爆吸尘器/7.5KW工业吸尘器/水浴式吸尘器源头厂家精选

工业清洁设备行业正迎来技术升级浪潮,5.5KW大功率工业吸尘器凭借其卓越的清洁效率和稳定的工作性能,已成为制造业企业的首选清洁解决方案。 在工业4.0和智能制造加速推进的背景下,精密制造、化工、医药等领域对生产…

102302143郑泽雄第一次作业

1.用requests和BeautifulSoup库方法爬取大学排名信息。 核心代码及结果由图可知,所需信息在table的tbody下的 标签,然后逐一排查寻找需要的5个标签即可。 心得 从这道题我掌握了如何使用正则化表达式匹配中文序列,当…

2025 年兰州凯文中学推荐:兰州凯文中学,二十载深耕民办教育 双师赋能全维育人 以低进高出成效书写成长答卷

行业背景 当前,我国普通高中教育进入高质量发展新阶段,教育部《普通高中学校办学质量评价指南》明确提出 “坚持以评促建、强化增值评价” 的导向,推动民办教育朝着特色化、优质化方向转型。兰州市积极推进民办中学…

详细介绍:Uvicorn - Python ASGI Web 服务器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

OpenEuler 22.03 手动升级 OpenSSH 至 10.2p1 完整方案

本文档提供在 OpenEuler 22.03 LTS 系统上,将 OpenSSH 手动升级至 10.2p1 版本的完整、安全的操作方案。方案包含准备、升级、验证、回滚四个核心环节,并重点集成了对 SELinux 策略的自动化处理。 1、方案概述项目说…