В ABAP существует инструмент, позволяющий создавать объекты в Общей памяти.
Общая память - это область памяти на сервере приложений, к которой обращаются все программы написанные на ABAP данного сервера. Существует возможность создавать экземпляры объектов в общей памяти и обращаться к ним из разных программ.
Помните, что объекты общей памяти существуют до тех пор, пока существует экземпляр SAP. Любые действия по перезапуску сервера, обновлению системы и т.д. могут удалить экземпляр. Кроме того, любое изменение корневого класса требует удаления и обновления существующих объектов памяти.
Транзакция SHMA - работа с областями Общей памяти.
Области и Экземпляры Области:
Область - это шаблон для экземпляров области в общей памяти. Несколько экземпляров области могут быть созданы из одного экземпляра области, отличаясь друг от друга по имени. Кроме того, может быть несколько версий экземпляра области (версии экземпляра области), которые отличаются друг от друга идентификатором версии. Все версии экземпляров области с тем же именем экземпляра области составляют экземпляр области. В простейшем случае (без управления версиями) экземпляр области состоит из одной версии экземпляра области.
Применение:
1) Использование в качестве общего буфера.
Общий буфер - это хранилище данных, которое редко изменяется (один раз в день, максимум максимум один раз в час), обычно только одним пользователем. Количество данных может быть очень большим. Как правило, многие пользователи имеют доступ на чтение к совместно используемому буферу одновременно. Типичное использование общего буфера для хранения каталога.
2) Использование в качестве эксклюзивного буфера.
Эксклюзивный буфер - это хранилище данных, доступ к которому можно прочитать или записать только одному пользователю или - реже - одному пользователю с правами записи, а другому - с правом чтения. Данные, хранящиеся в эксклюзивном буфере, должны быть доступны в течение более длительного периода времени, то есть дольше, чем время жизни программы.
Другое использование не подразумевается. Текущая логика блокировки не позволяет устанавливать конкретные блокировки для следующих требований:
- Много параллельного доступа для чтения и записи
- Частые записи доступа
- Разделение на изменяемые и неизменяемые области
Хотя логика блокировки делает первые два способа применения технически возможными, они не практичны, поскольку большинство обращений к объекту будет отклонено.
Пример:
Проще говоря, мы создаем класс, который имеет методы для работы с Shared Memory и класс хранящий данные. Как обычно существует много подводных камней при использовании, которые лучше искать в стандартной документации. Либо на форумах.
Заходим в SE24 и создаем конечный класс:
Указываем, что он предназначен для работы с
Shared Memory
Создаем атрибут gv_pernr для хранения данных и методы SET_* GET_ для записи\получения.
Сохраняем класс и активируем.
Далее необходимо зайти в транзакцию SHMA и создать область
Прописываем в корневой класс, ранее созданный нами класс. Также можно указать множество настроек, про которые лучше прочитать в справке, информация там будет более полной чем мой краткий пересказ.
Сохраняем область, при этом она будет произведена генерация области, а также будет создан класс для работы с ней.
Класс имеет методы для работы с областью. Теперь можем применять созданные объекты.
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 |
REPORT z_demo_shm_pay. PARAMETERS: p_pernr TYPE persno DEFAULT '00000001'. DATA gv_pernr_for_get TYPE persno. DATA lr_handle TYPE REF TO z_test_area. " Класс области DATA lr_root TYPE REF TO zcl_shm_test. " Класс данных ****************************************************** * Ошибка чтения DATA excp TYPE REF TO cx_shm_no_active_version. TRY. lr_handle = z_test_area=>attach_for_read( ). "блокируем область для чтения lr_handle->root->get_pernr( IMPORTING ev_pernr = gv_pernr_for_get ). "пытаемся прочитать нашим методом lr_handle->detach( )."снимем блокировку для чтения CATCH cx_shm_no_active_version INTO excp. DATA(lv_read_error) = abap_true. ENDTRY. ****************************************************** IF lv_read_error = abap_true."Ошибка при чтении lr_handle = z_test_area=>attach_for_write( ). "блокируем область для записи ELSE. lr_handle = z_test_area=>attach_for_update( ). "блокируем область для обновления ENDIF. CREATE OBJECT lr_root AREA HANDLE lr_handle. lr_handle->set_root( lr_root ). lr_root->set_pernr( iv_pernr = p_pernr ). " наш метод для установки параметра lr_handle->detach_commit( ). " снимем блокировку для записи и сохраним |
Из транзакции SHMA можно смотреть на области: