您要读取的数据在系统中不存在,可能已经被删除
问题描述
当我们用实体的主键去查询数据库,返回实体数据时;如用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
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf