SAP Shared Memory的使用方法
下图为SAP内存体系架构名,可见Shared Memory位于数据库之上、用户内存之间,主要用于解决在不同用户中间传值的问题。
我们知道,ABAP Memory主要是用于同一个用户同一个会话内部的数据传递,User Memory(也叫SAP Memory)主要是用于同一个用户同一次登录不同会话之间的值传递,而Shared Memory则是用于同一个SAP应用内不同用户之间的数据传递。
共享内存区域(特定的类和方法在用户间传递值) > User内存(parameter在external session间传递值) > ABAP内存(memory id在internal session间传递值) > 运行时内存(程序里的变量间传值).
SAP memory使用SET/GET parameters
SET PARAMETER ID ‘BUK’ FIELD IV_BUKRS.
GET PARAMETER ID ‘BUK’ FIELD IV_BUKRS.
Parameter存放在表TPARA中,SM30可维护这个表。在SE11维护数据元素时维护,这样程序中就能使用了。
ABAP Memory使用EXPORT 和IMPORT
EXPORT E_TAB TO MEMORY ID G_MEMORY.
EXPORT I_TAB FROM MEMORY ID G_MEMORY.
注意:E_TAB和I_TAB分别是导出和导入的参数,这两个参数的数据结构一定要一样,否则dump.
由于SHM(Shared Memory的缩写)驻留在内存中,因此速度比直接从数据库查询要快,因此当不想查询数据库又想在用户间传递数据时,可以考虑使用这种方法。
SHM相关的事务代码:
SHMA Shared Objects: Management
SHMM Shared Objects Monitor
RZ10参数设置:
ipc/shm_psize_10
ipc/shm_psize_40
abap/shared_objects_size_MB
RZ20和ST06可以监控操作系统SWAP、内存等参数。
创建和使用共享内存区域的步骤:
1.SE24创建一个根类并勾选“启用共享内存”
2.SHMA创建内存区域,绑定第一步创建的root类,创建内存区域时会自动产生与区域名相同的类及操作方法
3.使用第二步自动产生的类的方法操作这个内存区域
#SE24创建root类
# SHMA创建内存区域
系统自动产生了与内存区域同名的类和操作方法。
#测试共享内存使用
可参考SAP DEMO程序:
DEMO_CREATE_SHARED_OBJECT
DEMO_CREATE_SHARED_DATA_OBJECT
其他文档:
https://www.doc88.com/p-919954717125.html
假设我们的ROOT类中某些属性需要全局共享。
我们新建一个程序测试共享内存对象的写入、读取、更新等操作(见文章末尾)。
当执行write操作之后,shmm中就能看到这个共享内存区域的信息了。
双击共享内存区域,可以进入区域内部查看共享的数据。
双击表可以看到表中的内容
为了验证这部分数据确实是保存再共享内存中,而不是从表SCARR中实时取的,我们修改一下SCARR的数据看下效果。
再重新进SHMM,还是原来的值,验证通过。
附:测试程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
*&---------------------------------------------------------------------* *& Report ZTEST032 *&---------------------------------------------------------------------* *& 测试SAP Shared Memory Objects使用. *&---------------------------------------------------------------------* REPORT ZTEST032. START-OF-SELECTION. PERFORM WRITE. PERFORM READ. "读的操作可以写在其他程序,能取到数据. PERFORM UPDATE. PERFORM READ. FORM WRITE. *-------------------------shm write( )-------------------- DATA: MYSHMHANDLE_WRITE TYPE REF TO ZSHM_001, MYSHMROOT TYPE REF TO ZCL_ZSHM_001. "open default instance fow write. MYSHMHANDLE_WRITE = ZSHM_001=>ATTACH_FOR_WRITE( ). "注意括号中间要加空格. "logic. CREATE OBJECT MYSHMROOT AREA HANDLE MYSHMHANDLE_WRITE. "写一个字段到共享内存中 MYSHMROOT->SHM_TEST_CHAR = 'Hello World From SAP!'. "写一个内表到共享内存中 SELECT * UP TO 5 ROWS INTO CORRESPONDING FIELDS OF TABLE MYSHMROOT->SHM_TEST_SCARR FROM SCARR. IF SY-SUBRC IS INITIAL. MYSHMHANDLE_WRITE->SET_ROOT( MYSHMROOT ). MYSHMHANDLE_WRITE->DETACH_COMMIT( ). ELSE. MYSHMHANDLE_WRITE->DETACH_ROLLBACK( ). ENDIF. ENDFORM. FORM READ. *-------------------------shm read( )-------------------- DATA: MYSHMHANDLE_READ TYPE REF TO ZSHM_001. "open default instance fow read. MYSHMHANDLE_READ = ZSHM_001=>ATTACH_FOR_READ( ). "注意括号中间要加空格. DATA(LV_CHAR) = MYSHMHANDLE_READ->ROOT->SHM_TEST_CHAR. DATA(LT_ITAB) = MYSHMHANDLE_READ->ROOT->SHM_TEST_SCARR. WRITE : / LV_CHAR. LOOP AT LT_ITAB ASSIGNING FIELD-SYMBOL(<FS1>). WRITE : / <FS1>-CARRID, <FS1>-URL. ULINE. ENDLOOP. "release lock. MYSHMHANDLE_READ->DETACH( ). ENDFORM. FORM UPDATE. *-------------------------shm update( )-------------------- DATA: MYSHMHANDLE_UPDATE TYPE REF TO ZSHM_001, MYSHMROOT TYPE REF TO ZCL_ZSHM_001. "open default instance fow write. MYSHMHANDLE_UPDATE = ZSHM_001=>ATTACH_FOR_UPDATE( ). "注意括号中间要加空格. "logic. CREATE OBJECT MYSHMROOT AREA HANDLE MYSHMHANDLE_UPDATE. MYSHMROOT->SHM_TEST_CHAR = 'This is an updated messages!'. SELECT * UP TO 8 ROWS INTO CORRESPONDING FIELDS OF TABLE MYSHMROOT->SHM_TEST_SCARR FROM SCARR. IF SY-SUBRC IS INITIAL. MYSHMHANDLE_UPDATE->SET_ROOT( MYSHMROOT ). "SET_ROOT方法将会清空没有在update操作里赋值的变量,注意. MYSHMHANDLE_UPDATE->DETACH_COMMIT( ). ELSE. MYSHMHANDLE_UPDATE->DETACH_ROLLBACK( ). ENDIF. ENDFORM. |
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/3770.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。