SAP Shared Object 01 (共享对象)

介绍

共享对象是在共享内存中的一个对象。共享内存是应用服务器中的一个内存区域,可以被应用服务器中的所有程序访问。

在共享对象出现之前,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一样