Powershell + Lotus: работа над ошибками, часть 1

Прошло много времени с тех пор, как я приручил Lotus при помощи Powershell. С тех пор много воды утекло, а у меня по мере решения разных задач стало появляться понимание, как более правильно это нужно было делать.

Поскольку моё понимание с каждым днём меняется, я не могу гарантировать, что всё описанное в этой статье является правильным. На следующий день у меня может появиться другой, ещё более правильный способ.

Пример 1. Поиск документа.

Было: Найти документ заданного типа (переменная $Form), у которого значение поля, имя которого прописано в переменной $Field, имеет значение $Value.

$notesDate = $notesSession.CreateDateTime("1990-01-01")
$query = "SELECT form = '"+ $Form + "' & Status != '0' & " `
+ $Field + " = '" +$Value + "'"
$docCollection = $LotusDBObject.Search($query, $notesDate, 0)

Стало: После того, как количество документов в лотусовой базе достигло нескольких тысяч, поиск документа при обновлении каждой записи стал выполняться очень долго (до нескольких секунд). Я попросил администраторов построить полнотекстовый индекс, удивился, что ничего не изменилось, а затем прочитал документацию, и понял, что полнотекстовый индекс предназначен только для поиска по всему содержимому документа. При этом нужно использовать метод NotesDatabase.FTSearch вместо Search, а выходные данные у него совсем не те, которые требуются мне.

Я всего лишь сохранил в БД несколько тысяч объектов с информацией об установленных на Websphere Message Broker приложениях. А после того, как я собирался добавить в БД информацию, собранную со всех серверов WAS – переменные Websphere Variables, Namespace Bindings, ресурсы JMS и JDBC, а также TCP-порты серверов приложений, производительность должна была упасть ещё в несколько раз.

Я даже написал Powershell-командлет, который ищет документ по нескольким ключевым полям, и убедился в его полной неприменимости в данных условиях.

Внезапно я понял, что вместо поиска через $LotusDBObject.Search нужно искать документ в виде (View), отсортированному по ключевому слову. Это требует небольшой доработки на стороне Lotus – нужно создать вид для каждого типа документа, отсортированный по столбцу, в котором находится ключевое значение.

Так, для серверов это будет поле Hostname, а для серверов приложений – колонка, содержимое которой склеено из нескольких ключевых полей (Hostname, ProfileName, Cell, Node, AppServer). Для нормальной работы в виде достаточно этой одной колонки, она должна быть отсортирована.

Пример вида с одной колонкой (сортировка – за кадром):

indexWASDoc

Теперь поиск документа будет выглядеть таким образом:

function Find-LotusDocInView
# ищет документ в заданном виде (View) по ключевому атрибуту
# (первая отсортированная колонка вида)
# на выходе: набор документов Lotus, подходящих по параметрам
{
[CmdletBinding()]
param
    (
    [Parameter(Mandatory=$True, HelpMessage='Lotus Notes DB object')]
        [Alias('LotusDB')] $LotusDBObject,
    [Parameter(Mandatory=$False, HelpMessage='Lotus Notes View name')]
        [string]$View,
    [Parameter(Mandatory=$False, HelpMessage='Key attribute value')]
        [string]$key
    )
process
    {
    $NotesView = $LotusDBObject.GetView($view)
    if ($view)
        {
        $docCollection = $NotesView.GetAllDocumentsByKey($key)
        Return $docCollection
        }
    else
        {
        Write-Error "Cannot open view $view"
        }
    }
}

 

Добавить комментарий