среда, 30 января 2008 г.

А вы знали, что...

Недавно я столкнулся с проблемой - у меня была функция, которая создавала документ в другой базе данных и возвращала его... Точнее должна была возвращать, но ничего не возвращала. Я бешено сидел и пытался понять, почему так происходит. Оказалось, что если в Sub'e, который вызывает данную функцию, нет объекта базы, в которой функция создает документ, то будет возвращено Nothing.
Причину этого явления очень доходчиво объяснил Akupaka в этом сообщении:
это связанно с тем, что лотус убивая объект БД чистит память под объектами, полученными из этой БД

Поэтому в функцию, которая создает документ в какой-либо базе данных, имеет смысл передавать объект той самой базы, в которой необходимо создать документ

2 комментария:

Roman K комментирует...

Как вариант, в функцию можно не передавать объкт БД, этот объект БД может быть просто инициализарован (задублирован) в локальной переменной вызывающего функцию кода, правда, этого немного скрывает связь и кто-то может просто удалить инициализацию БД в вызывающем коде, как лишнюю...
Еще можно объявить переменную БД в функции с помощью слова Static, тогда она тоже останется в памяти и возвращаемый результат будет корректным, правда, я не исследовал, что будет если эту же функцию вызвать для другой БД, и что будет твориться в памяти, если функцию вызывать множество раз, по-идее, память под переменную будет занята единожды, но кто знает :)
Еще хороший вариант - кеширование часто используемых объектов. Для этого необходим как минимум один глобальный объект, например list, в котором можно содержать другие объекты документов, баз и другие нужные данные. и перед инициализацией нового объекта, можно спросить у списка, нет ли у него уже инициализированного нужного объекта, если есть, то взять из списка, иначе создать и положить в список...

Анонимный комментирует...

Вы не правы. Пишите мне в PM.