介紹

共享物件是在共享記憶體中的一個物件。共享記憶體是應用伺服器中的一個記憶體區域,可以被應用伺服器中的所有程式訪問。

在共享物件出現之前,ABAP使用EXPORT 和 IMPORT語句實現記憶體區域中內容的共享。

EXPORT和IMPORT實現效率比較低下:因為傳送方首先將需要傳遞的變數複製到記憶體中,然後接收方再從記憶體中將變數複製到接收方程式中,這兩次複製基本上沒有產生任何實際的意義。

共享記憶體通過儲存共享物件的共享物件記憶體得到增強。共享物件通過共享記憶體區域被儲存。可以通過事務程式碼SHMA對共享記憶體區域的進行建立和管理。

啟用共享記憶體的類

將類的例項儲存在共享記憶體中的前提是物件的類必須在CLASS語句中使用SHARE MEMORY ENABLED進行定義,或者在類編輯器中選擇“共享記憶體啟用”標識。

每一個區域都和全域性區域根類相關聯。該根類可以包含單獨的資料和對其他啟用共享記憶體的類例項的引用,或者在自己的屬性中對匿名資料物件的引用。

區域類和區域抓手

當時用SHMA定了一個區域後,會同時建立一個相同名字的全域性最終區域類,該全域性類為CL_SHM_AREA(CL_ABAP_MEMORY_AREA的子類)的子類。

在ABAP程式中,使用生成的區域類的方法專門訪問區域中的資料。有一些靜態方法可以將ABAP程式(或其他內部session)繫結到記憶體共享中的區域例項(attach methods)。

繫結建立區域類的例項作為區域抓手,同時會建立一個鎖。

ABAP程式可以使用區域抓手訪問繫結的區域例項版本,進而訪問儲存在共享物件中的資料。區域抓手還包含刪除連線或鎖定的方法(detach methods)。

 CRATE DATA - AREA HANDLE

這個語句在共享記憶體的區域例項版本中建立一個匿名資料物件做為共享物件,繫結到handle引用的區域抓手。

對於抓手,必須指定一個靜態型別為CL_ABAP_MEMORY_AREA或它的一個子類(area class)。

當這個語句執行的時候,handle必須指向一個區域抓手和這個區域抓手必須繫結一個帶有更改鎖的區域例項版本。

如果要建立這樣的引用,有以下選項:

  • 傳輸使用SHMA建立區域類的ATTACH_FOR_WRITE或ATTACH_FOR_UPDATE方法的返回值。
  • 傳輸任一區域類的GET_HANDLE_BY_OREF方法的返回值。
  • 傳輸預定義類CL_IMODE_AREA的GET_IMODE_HANDLE方法的返回值。

後者就是對當前內部模式區域抓手的引用,CREATE DATA語句就像沒有附加AREA HANDLE一樣。(這句簡單理解就是 AREA HANDLE 後面的物件只是一個簡單引用,CREATE DATA 後面的物件使用時和沒有附加AREA HANDLE一樣