一、shared memory相关概念
共享内存:是存在于应用程序服务器的一块内存区域,层次高于abap内存和sap内存(前者仅适用于内部会话internal session之间的数据传输,后者适用于external session外部会话和内部会话的数据传输)。不考虑角色权限,任意用户的任意程序都可访问共享内存区域。
区域根类:即启用共享内存的类,通过se21创建,需声明shared memory enabled或者勾选共享内存标识。必须分配接口IF_SHM_BUILD_INSTANCE。
区域类:通过SHMA创建,为cl_abap_meoory_area的子类。需在根类和构造器类处绑定之前建立的区域根类。
区域抓手:即区域类的实例r_handle,只需声明不用create,通过 area handle r_handle说明在区域 r_handle中创建对象,为了处理区域中创建的对象,需用区域类中的set_root()方法绑定根类对象r_root。
data: r_handle type ref to cl_abap_meoory_area,
r_root type ref to cl_abap_my_root. "se21创建,必须分配接口IF_SHM_BUILD_INSTANCE
r_handle = cl_abap_meoory_area => attach_For_write(). "设置更改锁
*r_handle = cl_abap_meoory_area => attach_For_update(). "设置更改锁
create object r_root area handle r_handle. "说明在区域 r_handle中创建对象r_root.
r_handle->set_root(r_root)."为了处理区域实例 r_handle中创建的对象
相关锁概念:共享内存中系统通过读锁和写锁实现版本控制,读锁可以并行获取,写锁独占。读锁可通过attach_For_read()语句被多个对象并行占有,通过deatch()释放。写锁即更改锁,通过attach_For_write()或attach_For_update()语句占有,通过deatch_commit()释放。
*更改锁加锁、释放
r_handle = cl_abap_meoory_area => attach_For_write(). "设置更改锁
*r_handle = cl_abap_meoory_area => attach_For_update(). "设置更改锁
r_handle => deatch_commit(). "更改锁释放
*读锁加锁、释放
r_handle = cl_abap_meoory_area => attach_For_read(). "设置读锁,防止读过程中对象被删除
r_handle => deatch(). "读锁释放
区域实例版本:共享内存中可以同时存在几个区域实例r_handle的版本,数量可能限制,活动版本只存在一个,过时版本可以存在多个,过期版本被垃圾回收器删除可忽略。读锁加锁时,读取共享对象中的数据,版本为活动版本,此时若更改锁加锁,区域实例版本被激活,另外生成设置中版本,在更改锁释放后,设置中版本转为活动版本,其他读锁所在版本转为过时版本,在读锁释放后,过时版本转为过期版本被垃圾回收器删除。在写锁释放频率快于读锁释放频率时,可以同时存在多个过时版本。
二、具体步骤和相关语法
可参考以下文章,非常详细。