您要读取的数据在系统中不存在,可能已经被删除

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

您要读取的数据在系统中不存在,可能已经被删除

问题描述

当我们用实体的主键去查询数据库,返回实体数据时;如用BusinessDataServiceHelper.loadSingle通过pkid去查询数据,在对应的实体表中不存在,就会出现此问题。


原因分析

出现该问题主要原因就是,数据库表中不存在要查找的数据

场景一:

业务代码,查询数据在保存数据之前;因为数据还未持久化

场景二:

前端上有数据展示,然后去查询数据库没有数据,有可能是因为缓存和数据库数据不同步导致的。例如基础资料都是有缓存的,由于不规范的一些操作直接把表里的数据删除了,没刷新基础资料的缓存,就会出现数据不一致

场景三:

多个人同时操作一条数据,前面的操作把数据删除了,后面的操作要去查询该数据

解决方案

  • 例如在代码中查询一条数据库不存在的数据,报错


  • 对应的物理表,不存在需要查询的数据


如果是平台功能报类似的错误,不知道如何定位物理表,可以通过把sql打印到控制台:



sql输出到控制台:

修改启动类kd.bos.debug.mservice.DebugServer

① 将System.setProperty(“db.sql.out”, “false”); 修改为System.setProperty(“db.sql.out”, “true“);

② 在JettyServer.main(null);前添加

DB.setSqlLogger(new SqlLogger() {

@Override

public void log(String sql, Object… arg1) {

System.out.println(sql);

}

});

③ 导包

import kd.bos.db.DB;

import kd.bos.db.SqlLogger;


清除缓存:

kd.bos.servicehelper.BusinessDataServiceHelper#removeCache


查询数据是否存在:

kd.bos.servicehelper.QueryServiceHelper#exists(java.lang.String, java.lang.Object)


注意事项

  • 尽量不要在同一个事务中对同一条数据同时做查询和删除操作

  • 在不确定数据存不存的情况下,建议先对数据做判断:kd.bos.servicehelper.QueryServiceHelper#exists(java.lang.String, java.lang.Object)

  • 如果数据量不是很大,不影响查询效率的情况下,数据删除可以设计为逻辑删除,不做物理删除


参考资料














您要读取的数据在系统中不存在,可能已经被删除

问题描述当我们用实体的主键去查询数据库,返回实体数据时;如用BusinessDataServiceHelper.loadSingle通过pkid去查询数据,在对应的实体表...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息