[轉]ABAP Memory/SAP Memory/Shared Buffer/Database
ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER語句,可對使用者記憶體/伺服器記憶體/資料庫進行儲存和訪問。不過可能很多人對此還不是很瞭解,下面我們透過例項來測試它們的區別和聯絡。
1. ABAP Memory
使用者登陸後,最多一個系統可以開6個視窗,這在SAP中稱為External Mode。
而同一個視窗中,執行某程式後,可以透過CALL TRANSACTION/SUBMIT或其他程式碼跳轉到其他程式,這個稱為Internal Mode。Internal Mode的呼叫棧最多為9層。
那麼ABAP Memory,它是屬於Internal Mode間可以共享的資料,而External Mode間無法共享。
例子. 建立程式A,輸入:
DATA matnr TYPE matnr.
IMPORT matnr FROM MEMORY ID 'YTEST_MATNR'.
WRITE matnr.
建立程式B,輸入:
DATA matnr TYPE matnr.
matnr = '000000000000001234'.
EXPORT matnr TO MEMORY ID 'YTEST_MATNR'.
matnr = '000000000000001234'.
EXPORT matnr TO MEMORY ID 'YTEST_MATNR'.
SUBMIT y_program_a. "呼叫程式A
直接執行B,發現程式A從ABAP Memory讀到了值並輸出到LIST.
說明:
(1)除錯執行B到EXPORT語句後面,Goto-System Area-ABAP Memory,可以檢視到名為YTEST_MATNR的一片記憶體。
(2)如果B和A執行在不同的視窗,則A將訪問不到資料;當使用者輸入/N退出當前程式時,記憶體值也將被清空。
(3)該語句適用於CALL TRANSACTION/SUBMIT過程中的資料共享,也常用於User Exit,類似於定義全域性變數的效果。
2. SAP Memory
上面說了External Mode,那麼它們之間共享資料必須透過SET/GET PARAMETER語句,不再是EXPORT/IMPORT的模式。
例子. 建立程式A,輸入:
DATA matnr TYPE matnr.
GET PARAMETER ID 'YTEST' FIELD matnr.
WRITE matnr.
建立程式B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
在視窗1執行程式B並關閉後,在視窗2執行程式A,發現程式A仍然讀到了SAP Memory的值。
說明:
(1)除錯時,可透過Goto-System Area-SAP Memory,檢視到YTEST及其對應的值。
(2)SET/GET PARAMETER的值與本次登陸有關,當使用者登出後才失效。在使用者登陸的時候,系統會根據每個使用者User Profile-Own Data-Parameter下的設定,載入到SAP Memory。
(3)Data Element中可以看到Further Characteristics下可定義PARAMETER ID,代表該欄位作為螢幕元素時,可讀取該PARAMETER ID作為預設值。比如VA03會自動顯示剛剛建立的訂單號。
3. SHARED MEMORY/SHARED BUFFER
前面介紹的都是使用者記憶體,那麼不同使用者間如何實現資料共享呢?可以用SHARED MEMORY或SHARED BUFFER,它們是伺服器上的某片所有使用者共享的記憶體。關於SHARED MEMORY和SHARED BUFFER的區別,可以F1檢視幫助。如果EXPORT SHARED BUFFER,則必須IMPORT SHARED BUFFER才能讀到,用IMPORT SHARED MEMORY是讀不到的。反過來也是。
例子. 建立程式A,輸入:
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
WRITE matnr.
建立程式B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
先在使用者1的電腦上執行程式B,然後在使用者2的電腦上執行程式A,發現使用者2可以讀取到值。
說明:
(1)既然是伺服器上的所有使用者共享空間,那麼該值將儲存到伺服器關機重啟為止,除非使用者用DELETE語句清除它。其實這個跟ENQUEUE/DEQUEUE有點相似之處。
(2)資料庫也可共享資料,不過伺服器共享肯定速度快些,理論上適合網路遊戲,呵呵。
(3)INDX是系統中存在的符合特定格式要求的表。但這不代表該EXPORT/IMPORT語句將在表INDX中增加記錄,僅僅代表伺服器借用了INDX的結構來管理該片共享記憶體。
4. DATABASE
上面說了SHARED BUFFER並不訪問資料庫,而要訪問資料庫就應該用DATABASE。
建立一個程式,錄入程式碼:
DATA: matnr TYPE matnr.
matnr = '000000000000004321'.
EXPORT matnr TO DATABASE indx(aa) ID 'YTEST_MATNR'.
matnr = '000000000000004321'.
EXPORT matnr TO DATABASE indx(aa) ID 'YTEST_MATNR'.
執行程式,然後SE16檢視錶INDX,發現新增了一條RELID = AA, SRTFD = YTEST_MATNR的記錄。如果EXPORT的資料量比較大,則新增的將是多條,這些條目的欄位值SRTF2從0遞增。所以EXPORT DATABASE與普通資料庫操作的不同之處是,它適合大資料量的操作,系統自動將其拆分成多條記錄並儲存到資料庫中,比如圖片或文件。而用IMPORT DATABASE的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/443058/viewspace-1039646/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Database Memory StructuresOracleDatabaseStruct
- Oracle Database In-MemoryOracleDatabase
- Oracle Shared Pool Memory ManagementOracle
- oninit -vy 出錯: Fatal error in shared memory creation 以及 shared memory already existsError
- 什麼是 ABAP 程式語言的 Used Memory 和 Allocated Memory
- SAPOSCOL not running (Shared memory not available)AI
- Oracle In Memory Undo(轉)Oracle
- Oracle Database In-Memory Certified with EBS 12.2OracleDatabase
- PostgreSQL DBA(95) - PG 12 Partition(out of shared memory)SQL
- GPU程式設計(五): 利用好shared memoryGPU程式設計
- Managing Non-Volatile Memory in Database SystemsDatabase
- [江楓]In Memory Undo與logical standby databaseDatabase
- memory
- [轉帖]Native Memory Tracker
- vertex buffer 資料結構 如何讀vb的memory pool資料結構
- Oracle_TimesTen_and_In-Memory_Database_Cache_11g_Ed_1OracleDatabase
- Document TitleTECH: Unix Semaphores and Shared Memory Explained (Doc ID 15566.1)AI
- ASMM (Auto Shared Memory Manangement) 自動共享記憶體管理ASMNaN記憶體
- 解決ORA-27125: unable to create shared memory segment
- [20171128]rman input memory buffer 3.txt
- ORA-27125:unable to create shared memory segment 解決方法
- ORA-27125:unable to create shared memory segment 解決方法?
- [20171129]rman input memory buffer 4.txt
- [20171129]rman input memory buffer 5.txt
- OOM(Out Of Memory)OOM
- Memory Management in RustRust
- java out of memoryJava
- ORA-27100: shared memory realm already exists解決方法
- Oracle10g New Feature -- 13. Automatic Shared Memory ManagementOracle
- Incorrect MEMORY_MAX_TARGET (> Available RAM) Can Lead To Database HangsAIDatabase
- VM warning: INFO: OS::commit_memory Cannot allocate memoryMIT
- 11g的MEMORY_TARGET和MEMORY_MAX_TARGET
- ORACLE LARGE MEMORY(zt)Oracle
- 如何理解Memory leak
- OOM--OUT OF MEMORYOOM
- Eclipse Memory AnalyzerEclipse
- Linux Cache MemoryLinux
- memory management unit (MMU)