您要读取的数据在系统中不存在,可能已经被删除
问题描述
当我们用实体的主键去查询数据库,返回实体数据时;如用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)
如果数据量不是很大,不影响查询效率的情况下,数据删除可以设计为逻辑删除,不做物理删除
参考资料
您要读取的数据在系统中不存在,可能已经被删除
本文2024-09-23 01:10:46发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144274.html