Memory 在ABAP会话之间传递结构化数据?

Memory 在ABAP会话之间传递结构化数据?,memory,abap,Memory,Abap,众所周知,ABAP内存(导出/导入)用于跨调用堆栈在ABAP会话内传递数据,而SAP内存(SET/GET)是会话独立的,对用户会话的所有ABAP会话都有效 这里的陷阱是SET参数只支持基本的展开类型,否则会抛出错误: “LS_MARA”必须是字符类型字段(数据类型C、N、D或T)。借 全局赋值,如ASSIGN'(PrgmName)Globalvariable“TO FIELD-SYMBOLS()。并不总是一种方法,例如,如果要将结构传递给某个局部方法变量 对于简单的测试任务来说,创建SHMA共享

众所周知,ABAP内存(导出/导入)用于跨调用堆栈在ABAP会话内传递数据,而SAP内存(SET/GET)是会话独立的,对用户会话的所有ABAP会话都有效

这里的陷阱是SET参数只支持基本的展开类型,否则会抛出错误:

“LS_MARA”必须是字符类型字段(数据类型C、N、D或T)。借

全局赋值,如
ASSIGN'(PrgmName)Globalvariable“TO FIELD-SYMBOLS()。
并不总是一种方法,例如,如果要将结构传递给某个局部方法变量

对于简单的测试任务来说,创建SHMA共享内存对象似乎是一种过火的行为

到目前为止,我发现只有问题被提出了,但是从那里得到的解决方案很愚蠢,代表了一个完美的例子,说明了你不应该写,一个完美的反模式


如果要将结构或表传递给另一个ABAP会话,我们有哪些选项(数据库除外)?

在同一应用程序服务器中,您可以使用

您的要求的可能陈述:

EXPORT mara = ls_mara TO SHARED BUFFER indx(zz) ID 'MARA'.

在应用服务器之间,您可以使用。

像往常一样,Sandra有一个很好的答案

Export/Import To/From Shared buffer/Memory
功能非常强大。 但请明智地使用它,并确保您了解它位于1个应用程序服务器上,并且 是非持久性的。 如果需要,您可以使用rfc调用其他应用程序服务器以从其他服务器获取缓冲区。调用函数xyz目标“”

请参见功能
服务器列表
。即您在SM59内部连接中看到的内容

显然,共享缓冲区/内存缺乏持久性是关键考虑因素。 但是,在您仔细阅读docu之前,不明显的是共享缓冲区管理器如何根据缓冲区大小和可用内存放弃条目。当您访问共享缓冲区条目时,不能假定它会在那里。很可能是这样,但它可能会被“删除”,服务器可能会重新启动等。将其用作性能帮助工具,但始终假定条目可能不存在。 与共享缓冲区相反,共享内存存在上限问题,需要在添加更多项之前丢弃其他项。两者都有利弊

在St02中,在此处查找红色条目,已达到缓冲区限制。 请参阅“当前参数”按钮,该按钮告诉您哪些配置文件参数需要更改

此语言元素的一个重要用途是用于日志记录或可重构数据的高性能缓冲。它也适用于badis等场景,如果您无法发布提交。您可以在不发出提交或db提交的情况下“保留”信息。 您还可以更新/存储日志,而无需使用锁定。 使用简单原理,当前工作流程编号是唯一的

 CALL FUNCTION 'TH_GET_OWN_WP_NO'
  IMPORTING
    wp_index = wp_index.
使用索引号作为数据键的一部分

如果内核是7.40或更高版本,请参见class
CL\u OBJECT\u BUFFER
否则,请参见函数
SBUF\u OBJ\u SHOW\u OBJECT

享受共享缓冲区/内存的乐趣。
与共享内存对象相比,共享缓冲区的一个主要优点是ABAP垃圾收集器。SAPSYS垃圾收集会咬你的

当我试图以这种方式导出
mara
结构时,我得到了:
将mara=ls\u-mara从ls\u-mara ID'mar导出到共享缓冲区mara(sc)。
。我是否正确指定了缓冲区参数?我用了样品,你必须用一个。例如,您可以将表INDX复制到ZINDX,并使用
将mara=ls_mara导出到共享缓冲区ZINDX(zz)
(“zz”或任何您想要的内容)。如果您要求,使用共享缓冲区/内存,该表被用作在内存中存储数据的支持,表中不存储任何内容(某些内容仅通过
存储到数据库
)。谢谢,它起到了作用,为将来的访问者添加了更多细节。有办法在调试器中检查它吗?我看不到我的值我不知道如何通过调试器显示扩展内存。
共享内存与共享缓冲区相反,存在上限问题
所以为什么不始终使用缓冲区?手动清除内存是一个额外的麻烦,没有任何明显的好处。共享内存的用例是什么?我总是使用共享缓冲区,而不是共享内存。但是,如果您在缓冲区中放置了太多的信息,那么用于删除条目的算法并不像docu所暗示的那么简单。在高容量的情况下,整个内存块都可以被丢弃。我在一个富有成效的场景中使用它时被烧伤了。恢复的工作和时间危险地侵占了迁移窗口。损失信息至关重要,必须重新计算。只是侥幸逃脱了。这只是一个警告…只是把它传递出去。。。从消防栓喝水对你有好处。如果有兴趣,可以在离线时告诉您更多信息。