Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не закрываются объекты через CacheActiveX / 18 сообщений из 18, страница 1 из 1
01.07.2008, 12:45
    #35403790
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
В общем, проблема в следующем...
Используя COM оболочку CacheActiveX подключаемся к Каше и работаем с объектами. По завершению работы с объектом на клиентской стороне убиваем ссылку на него - при этом на серверной стороне объект не отцепляется и висит в процессе, соответственно деструктор не вызывается. Объект с серверной стороны может(!!!) убиться только при следующем вызове сервера и то не всегда. Такое ощущение, как будто объект кто-то держит, хотя на клиенте полностью убиты все ссылки на него. Возможно ActiveX прослойка вызывает очистку ссылок на объект только при обращении к этой прослойке - тогда вопрос, почему некоторые ссылки убиваются не сразу при обращении к серверу, а спустя несколько вызовов, когда на клиенте очистятся некоторое количество объектов?

В общем, как добиться того, чтобы при очистке ссылки на клиенте - объект на серверной стороне сразу же отцеплялся?
...
Рейтинг: 0 / 0
01.07.2008, 13:12
    #35403893
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Для корректного закрытия объекта на сервере необходимо вызывать метод SYS_Close.
Например (код на Delphi с ранним связыванием):
Код: plaintext
1.
2.
3.
4.
5.
6.
var p:Person;
...
p:=Person(f.OpenId('test.person','45'));
ShowMessage(p.SYS_Id);
p.SYS_Close;
p:=nil;
Подробнее см. документацию на аналогичные методы только для .NET или SYS_Close для ActiveX.
...
Рейтинг: 0 / 0
02.07.2008, 08:41
    #35405562
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Используем Cache' 5.2.
Клиент на Delphi.
Взаимодействие осуществляется через CacheActiveX.

Маленький примерчик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
    CacheFactory: Factory;
    emp,comp: variant;
    str: String;
begin
    CacheFactory := CoFactory.Create;
    if not CacheFactory.Connect('cn_iptcp:127.0.0.1[1972]:SAMPLES) then Exit;
    emp := CacheFactory.OpenId('Sample.Employee','101',EmptyParam);
    if Assigned(IDispatch(emp)) then begin
        str := emp.Title;
        comp := emp.company;
        if Assigned(IDispatch(comp)) then begin
            str := comp.Name;
            comp.SYS_Close;   // Закрываем Sample.Company
            comp := NULL;     // Убиваем ссылку
        end;
        emp.SYS_Close;        // Закрываем Sample.Employee
        emp := NULL;          // Убиваем ссылку
    end;
    CacheFactory.Disconnect;
    CacheFactory:=nil;

После зыкрытия объектов на клиенте объекты всё еще висят в процессе, деструктор не вызывается, логика при закрытии объектов не отрабатывается.
Если зайти посмотреть переменные процесса через портал управления, то там будут видны ссылки на эти объекты - %sysOrefs(2), %sysOrefs(3).
Больше объекты с клиентской стороны ни кто не держит - получается, что держит ActiveX прослойка.

Кстати, вызывать метод SYS_Close - это пережиток прошлого, т.к. он вызывает на сервере %Close, который ни чего не делает. Сейчас система сама подсчитывает ссылки на объект и уничтожает его (вызывается деструктор) при при достижении кол-ва ссылок 0.

Вопрос вот в чем - почему прослойка не отпускает объекты и как добиться того, чтобы объекты на сервере сразу отцеплялись???

ЗЫ: Кажется мне, что это баг каши... :)
...
Рейтинг: 0 / 0
02.07.2008, 10:21
    #35405756
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
И еще - если работать через CacheObject, а не CacheActiveX, то объекты вроде закрываются сразу при убивании ссылки на клиенте.
...
Рейтинг: 0 / 0
02.07.2008, 11:35
    #35406004
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Наш опыт показал, что CacheActiveX еще довольно сырой (версии 2007.1-2008.1). По нему было открыто (и решено) несколько проблем в WRC. Хотя с закрытием объектов проблем в этих версиях не было.
...
Рейтинг: 0 / 0
02.07.2008, 11:51
    #35406046
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Alexey MaslovНаш опыт показал, что CacheActiveX еще довольно сырой (версии 2007.1-2008.1). По нему было открыто (и решено) несколько проблем в WRC. Хотя с закрытием объектов проблем в этих версиях не было.
Видать, просто не обращали внимание на закрытие объектов - т.к. при следующем опросе сервера или манипуляции с серверными объектами битые ссылки удаляются. Думаю, это связано с быстродействием, т.к. в CacheObject были периодические задержки при обращении к серверу, которые могли возникать из-за чистки серверных ссылок, а в CacheActiveX ссылки подчищаются не автоматически, а только при последующем доступе к серверу. Только вот происходит это не всегда.
Может кто знает 100% метод заставить сервер очистить все свои битые ссылки?
...
Рейтинг: 0 / 0
02.07.2008, 12:35
    #35406195
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Вы правы, в 2008.1 то же самое (версия CacheActiveX.dll 2008.1.0.401.0.6787). Думаю, это бага, а не фича. Глядя на их кол-во в subj, не перестаю удивляться, как они сами с ним работают (в Studio). Что ж, Вы первый заметили - вам и проблему открывать :)
...
Рейтинг: 0 / 0
02.07.2008, 15:57
    #35406928
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
SocratdvКстати, вызывать метод SYS_Close - это пережиток прошлого , т.к. он вызывает на сервере %Close, который ни чего не делает.
Всё верно. Но в то же время и sys_Close (другая ссылка). Возможно документация устарела, но я предпочитаю не рисковать.

To Alexey Maslov
Где Вы нашли, что Студия использует CacheActiveX.dll?
...
Рейтинг: 0 / 0
02.07.2008, 17:05
    #35407176
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
servitГде Вы нашли, что Студия использует CacheActiveX.dll?Признаю, был неточен. Студия, начиная с 5.1, использует CacheODBC.dll, которая реализует единый транспорт и для ActiveX- (CacheActiveX.dll), и для ODBC-доступа.
...
Рейтинг: 0 / 0
03.07.2008, 06:09
    #35407798
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Студия, как и CacheActiveX работает через программу %SYS.DBSRV, поэтому у меня тоже сложилось мнение, что Студия работает через CacheActiveX.

Мы тут заметили, что ActiveX для убивания битых ссылок и закрытия объектов на сервере посылает сообщения приограмме %SYS.DBSRV. Возможно, что для принудительного убития ссылки можно самому послать это сообщение. Вопрос лишь в том - как достучаться до этой программы, чтобы посмотреть код и узнать что именно делать? Стандартными средствами найти её не удалось, хотя она точно есть - для проверки можно вызвать d Error^%SYS.DBSRV .
...
Рейтинг: 0 / 0
03.07.2008, 06:14
    #35407800
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Ошибся в предыдущем посте - CacheActiveX работает через %SYS.BINDSRV.
...
Рейтинг: 0 / 0
03.07.2008, 09:54
    #35407983
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
To Socratdv
Попробуйте так:
Код: plaintext
1.
2.
3.
4.
5.
...
        emp.SYS_Close;        // Закрываем Sample.Employee
        emp := NULL;          // Убиваем ссылку
    end;
CacheFactory.ForceSync;
...
У меня на версии 2008.2.FT3 не остаётся ни одной ссылки.
...
Рейтинг: 0 / 0
03.07.2008, 10:11
    #35408031
Socratdv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Подобный метод (ForceSync), очишающий ссылки на сервере мы уже искали...
К сожалению, в Cache' 5.2 такого метода нету.. В 2007, вроде, тоже нет.
...
Рейтинг: 0 / 0
03.07.2008, 12:02
    #35408416
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
To Socratdv
Тогда закажите adhoc для Вашей версии Caché.
...
Рейтинг: 0 / 0
04.07.2008, 05:10
    #35410467
=Dimon=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
2servit
У меня Cache 2008.1 метода ForceSync у Factory - нет. :(
...
Рейтинг: 0 / 0
07.07.2008, 12:32
    #35414635
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
В CacheActiveX.dll версия 2008.1.0.401.0.6787 метод имеется и работает, как и пишет Servit (спасибо!). Это специальный билд Cache for Windows 2008.1 (Build 401_0_6787), включающий несколько AdHoc'ов, в том числе и CacheActiveX, перенесенный из 2008.2. Кстати, sys_Close() все-таки нужен, без него серверный счетчик ссылок не декрементируется.
...
Рейтинг: 0 / 0
07.07.2008, 14:55
    #35415146
=Dimon=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
И где взять сей замечательный билд?
...
Рейтинг: 0 / 0
07.07.2008, 15:01
    #35415165
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не закрываются объекты через CacheActiveX
Известно где. В саппорте ИнтерСистемз. Для этого, возможно, Вам придется открыть проблему.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не закрываются объекты через CacheActiveX / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]