运行时类型服务(RTTS)是否使用数据库来获取数据描述?

时间:2018-07-02 08:11:15

标签: sap abap rtts

问题

describe_by_data之类的get_ddic_field_listget_componentscl_abap_typedescr之类的方法是否从数据库中检索数据或在应用程序服务器上生成?

我查看了这些类,所有一些方法(大概是填充缓存的方法)似乎都是以非标准方式(METHOD ... BY KERNEL MODULE ...)提取数据的,而其他方法则是从缓存中提取数据的。我想知道如果不缓存它怎么拉。

Google也没有提供有关此主题的任何具体信息。

某些情况下,以防细节变得重要

我一直在研究为某些通用类实现动态选择子句的生成(以替换星号以实现S / 4HANA中基于列的处理,并希望减轻对DB的负担)。

由于大多数此类都将数据检索到字典类型结构中,因此我认为可以使用运行时类型服务(RTTS)的类型描述来获取字段列表并根据目标结构动态生成select子句。

在大多数情况下,我可以通过实现静态变量(并且每次会话仅处理一次)来解决性能损失(如果有的话)的问题,但是我遇到了类似的情况,其中静态变量不是一种选择(处理是并使用未知的类型),因此我不得不放弃这个想法,因为我不确定如果调用这些方法(例如每个会话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.

1 个答案:

答案 0 :(得分:3)

我不确定最新的ABAP版本如何,但是ABAP词典的内容(对于数据字典而言又名“ DDIC”)源自数据库表DDNTT和DDNTF(也称为“ nametab”)及其元素称为“数据库运行时对象”),它们在DDIC对象(表等,这些表是DD02L,DD03L,如@icbytes等)激活时填充。

当查询它们时,它们也会被传输并保留在每个应用程序服务器内存中。该内存称为 nametab缓冲区。当缓冲区已满时,最新数据将替换旧数据。

不知道性能,但毫无疑问,与您紧随其后的SELECT相比,它可以忽略不计。

关于RTTS的另一件事,始终使用GET_ *方法,而不是CREATE_ *方法,因为它们更快(它们的行为略有不同,但通常只有经验丰富的开发人员才需要使用后者)个)。

如果愿意,可以添加另一层内存,但是我认为这样做是不值得的(开发人员花费了更多时间+消耗了更多的内存,而性能没有大的提高)。