聊聊非用户内存的数据共享

1、用户内存

之前介绍了什么是ABAP内存和SAP内存,具体内容可浏览《聊聊SAP内存和ABAP内存》。

对于ABAP和SAP内存,都是在User Session中进行数据的分享传递,但不能实现不同用户间的数据共享

image

2、非用户内存

对于不同用户间数据共享,则需要使用下列方法

2.1、SHARED MEMORY / BUFFER

两者的区别:

SHARED MEMORY是操作系统提供的一种进程间通信机制。它分配一块物理内存区域,允许多个SAP工作进程访问同一块内存,为SAP实例内的所有工作进程提供共享数据的底层存储空间。

SHARED BUFFER是SAP内核在SHARED MEMORY之上构建的结构化缓存机制,显著提高性能。通过将频繁访问的数据(如ABAP程序、数据库表内容、屏幕定义、日历数据等)缓存在所有工作进程都能快速访问的内存中,避免重复的磁盘读取或重复计算。

SHARED BUFFER是SHARED MEMORY的一部分。如果把SHARED MEMORY比作是操作系统提供的大仓库,SHARED BUFFER就是这个大仓库里SAP规划和管理的多个专用储藏室(缓存区域)。

不过在用法上,两者没有太大区别

SHARED MEMORY

"--------------------@斌将军--------------------
DATA:lt_makt TYPE TABLE OF makt,
      ls_makt TYPE makt.

 ls_makt-matnr = '111'.
 APPEND ls_makt TO lt_makt.

EXPORT lt_makt TO SHARED MEMORY indx(aa) ID 'ZMAKT'."

IMPORT lt_makt FROM SHARED MEMORY indx(aa) ID 'ZMAKT'."

DELETE FROM SHARED MEMORY indx(aa) ID 'ZMAKT'."
"--------------------@斌将军--------------------

 SHARED BUFFER

"--------------------@斌将军--------------------
EXPORT lt_makt TO SHARED BUFFER indx(aa) ID 'ZMAKT'.

IMPORT lt_makt FROM SHARED BUFFER indx(aa) ID 'ZMAKT'.

DELETE FROM SHARED BUFFER indx(aa) ID 'ZMAKT'.
"--------------------@斌将军--------------------

甚至还能实现不同客户端之间的传输

比如A程序在300客户端抛数据

"--------------------@斌将军--------------------
DATA:lv_client TYPE mandt VALUE '300'.
EXPORT lt_makt TO SHARED MEMORY indx(aa) CLIENT lv_client ID 'ZMAKT'.
READ TABLE lt_makt INTO ls_makt INDEX 1.
WRITE:''.WRITE:ls_makt-matnr.
"--------------------@斌将军--------------------

 B程序在500客户端接数据

"--------------------@斌将军--------------------
DATA:lv_client TYPE mandt VALUE '300'.

IMPORT lt_makt FROM SHARED MEMORY indx(aa) CLIENT lv_client ID 'ZMAKT'.
READ TABLE lt_makt INTO ls_makt INDEX 1.
WRITE:''.WRITE:ls_makt-matnr.
"--------------------@斌将军--------------------

效果如下

image

2.2、DATABASE

相对于SHARED MEMORY和 SHARED BUFFER共享数据到内存而言,DATABASE是直接将数据持久化到数据库表中。

从层级上来讲:SHARED MEMORY在操作系统层;SHARED BUFFER在SAP应用层;DATABASE在存储层

从性能上来讲:SHARED BUFFER > SHARED MEMORY > DATABASE

使用方法:

"--------------------@斌将军--------------------
DATA:ls_indx TYPE indx.

ls_indx-aedat = sy-datum."日期
ls_indx-usera = sy-uname."用户
ls_indx-pgmid = sy-repid."程序名

EXPORT lt_makt TO DATABASE indx(bs) ID 'ZMAKT' FROM ls_indx."

IMPORT lt_makt FROM DATABASE indx(bs) ID 'ZMAKT'."

DELETE FROM DATABASE indx(bs) ID 'ZMAKT'."清空
"--------------------@斌将军--------------------

此处也使用了数据库表indx,(bs)代表区域,ID代表定义关键字

image

与SHARED BUFFER和SHARED MEMORY 不同的是,DATABASE会在INDX表中新增一条记录,而后者虽然也用到了INDX表,但只是使用了INDX的结构,并不真正存值。

image

当然,DATABASE也可以跨客户端使用

3、总结

结合这两篇文章可以知道,ABAP内存能共享在同一用户的同一窗口,SAP内存能共享在同一用户不同窗口,SHARED BUFFER / MEMORY和DATABASE能共享在不同用户,不同客户端。

以上就是关于非用户内存进行数据共享的介绍,希望对你有所帮助

定期更文,欢迎关注

 

posted @ 2025-08-19 09:02  斌将军  阅读(26)  评论(0)    收藏  举报