Прошло много времени с тех пор, как я приручил Lotus при помощи Powershell. С тех пор много воды утекло, а у меня по мере решения разных задач стало появляться понимание, как более правильно это нужно было делать.
Поскольку моё понимание с каждым днём меняется, я не могу гарантировать, что всё описанное в этой статье является правильным. На следующий день у меня может появиться другой, ещё более правильный способ.
Пример 1. Поиск документа.
Было: Найти документ заданного типа (переменная $Form), у которого значение поля, имя которого прописано в переменной $Field, имеет значение $Value.
$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). Для нормальной работы в виде достаточно этой одной колонки, она должна быть отсортирована.
Пример вида с одной колонкой (сортировка – за кадром):
Теперь поиск документа будет выглядеть таким образом:
# ищет документ в заданном виде (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"
}
}
}