abap - 运行时类型服务 (RTTS) 是否使用数据库来获取数据描述?
问题描述
问题
像describe_by_data
, get_ddic_field_list
, get_components
(ofcl_abap_typedescr
和类似的) 这样的方法是从数据库中检索数据还是在应用程序服务器上生成?
我查看了这些类,所有一些方法(可能是填充缓存)似乎以非标准方式(METHOD ... BY KERNEL MODULE ...
)提取数据,而其他方法则从缓存中提取数据。我想知道如果它没有被缓存,它是如何被拉出来的。
谷歌也没有给我任何关于这个话题的具体信息。
一些上下文,以防细节变得相关
我一直在研究为一些通用类实现动态选择子句生成(以替换 S/4HANA 中基于列的处理的星号,并希望减少对 DB 的压力)。
由于这些类中的大多数将数据检索到字典类型结构中,我想我可以使用运行时类型服务 (RTTS) 的类型描述来获取字段列表并根据目标结构动态生成 select 子句。
在大多数情况下,我可以通过实现静态变量(并且每个会话只处理一次)来解决性能损失(如果有的话),但是我遇到过类似的情况,静态变量不是一个选项(处理是在未知的情况下进行的) types),我不得不放弃这个想法,因为我不确定如果调用这些方法会如何影响峰值性能,假设每个会话 30 次。
编辑(只是一段代码,以避免进一步混淆,导致没有实质内容的居高临下的评论):
lo_struct ?= cl_abap_structdescr=>describe_by_data( header ).
ct_components = lo_struct->get_components( ).
"Loop through ct_components appending names to lv_select_clause
lv_select_clause = get_header_fields( is_target_structure = header ).
select single (lv_select_clause)
from rbkp
where gjahr = @iv_gjahr
and belnr = @iv_belnr
into corresponding fields of @header.
解决方案
我不能确定最新的 ABAP 版本,但是 ABAP 字典的东西(也就是数据字典的“DDIC”)源自数据库表 DDNTT 和 DDNTF(也称为“nametab”,其元素称为“数据库运行时” objects”)在激活 DDIC 对象(表等,这些表是 DD02L、DD03L,如@icbytes 所说的那样)期间填充。
当它们被查询时,它们也会被传输并保存在每个应用程序服务器内存中。此内存称为nametab 缓冲区。当缓冲区已满时,最新数据将替换最旧数据。
不知道性能,但毫无疑问,与您之后执行的 SELECT 相比,它可以忽略不计。
还有一件事,关于 RTTS,总是使用 GET_* 方法而不是 CREATE_* 方法,因为它们更快(它们的行为略有不同,但通常只有有经验的开发人员可能需要使用后者)。
如果您愿意,您可以添加另一层内存,但我认为这样做不值得(花费更多开发人员时间 + 消耗更多内存,而没有大的性能提升)。
推荐阅读
- java - Spring Webflux 在反应式堆栈中使用阻塞 HttpClient
- android - Admob 插页式广告未关闭
- gitlab - gitlab 和 asana:我团队的提交以单一名称出现在 Asana 中
- javascript - 控制台记录数据 - 本机反应
- networking - 有没有办法在 CDN 中选择要连接的 PoP?
- android - 将表移动到新的数据库迁移 Room Android
- django - 如何使用 Django admin 使用 Celery 创建自定义任务
- github - 获取 GitHub GraphQL API 中的维护者列表?
- node.js - 使用 API (NodeJS) 时 POST 请求中的错误处理
- python - 在numpy数组中删除nan后如何减少数组形状?