powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
4 сообщений из 4, страница 1 из 1
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
    #37268554
Vixler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юзаются DevExpress XtraGrid - таблицы на форме, прокси-классы для связи с базой, си-шарп.

У нас используются в программах два подхода. У обоих есть свои плюсы и минусы. Хотелось бы узнать, правильно и вообще можно ли так делать.

1. Работа напрямую с классами каше. Создали классы в базе, создали прокси класс, в программе на C# получили список объектов через sql запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Rail.RailStation - класс, созданный в каше
string sqlcommand = "SELECT * FROM Rail.RailStation";
CacheDataReader reader = ClassConnection.ExecuteSQLCommand(sqlcommand);
BindingList<Rail.RailStation> stations = new BindingList<Rail.RailStation>();
while(reader.Read())
{
Rail.RailStation station = Rail.RailStation.OpenId(reader["ID"].ToString());
stations.Add(station);
}

...и присвоили таблице на форме этот список:

Код: plaintext
gridControlStations.DataSource = stations;

И всё вроде прекрасно, таблица заполняется данными, данные можно редактировать, удалять, добавлять.

Но в один прекрасный момент всё начинает рушиться. Параметр Oref становится -2, дисконнект с базой, огромный красный крест на всю таблицу. Особенно часто такое встречается, когда в классе есть списки объектов других классов или отношения. В итоге код захламлён кучей Reload'ов и OpenId. Происходит это примерно так: считываем поле пару-тройку раз:

Код: plaintext
1.
2.
3.
4.
5.
Rail.RailStation station = (Rail.RailStation)gridViewStations.GetFocusedRow();
name = station.name;
...
name2 = station.name;
...
name3 = station.name;
...и всё! Никаких присваиваний, просто считывание поля! И бац! Oref == -2, айдишник пустой, крест на всю таблицу, туча ошибок, программу даже нельзя нормально закрыть, не прибегая к диспетчеру задач...

Пример немного утрирован, но проблема именно такая - просто считывается поле, ему значения не присваиваются и через пару вызовов летят ошибки. Приходится это всё дело отлавливать, плясать с бубнами вокруг функции Reload(), заного открывать по OpenId объект, предварительно сохранив ID (который у объекта уже успел стать null), заново формировать список для таблицы...

Сейчас всё вроде работает, хоть код и превратился в кашу, но кажется, что всё держится на тонкой грани, и время от времени вываливаются ошибки типа DisconnectObjectException. Короче кошмар.

2. Второй способ работает намного лучше, но заставляет фактически описывать классы дважды. Сначала в каше, потом один-в-один в C#. Считываем данные из каше, копируем данные в объекты C# и создаём список, которым заполняется таблица.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
BindingList<ClassChartpStation> stations = new BindingList<ClassCharpStation>();
Rail.RailStation stationDB = Rail.RailStation.OpenId(connect, "1");
ClassCSharpStation station = new ClassCharpStation();
station.Name = stationDB.Name;
station.Code = stationDB.Code;
stations.Add(station);
...
gridControlStations.DataSource = stations;

Работает, но приходится помимо дублирования класса писать много кода для синхронизации данных, контролировать обновление данных и т.п. Хотелось бы работать напрямую с классами каше через прокси-классы, но это сейчас похоже на хождение по лезвию бритвы...

Может кто писал подобным образом и сталкивался с такой проблемой? Верен ли вообще такой подход (в смысле первый вариант, работа напрямую с каше классами в таблицах) или нужно что-то исправить?
...
Рейтинг: 0 / 0
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
    #37268710
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vixler ,

Уже глядя на код, я вижу проблемы.
Работа на клиенте с подсчётом ссылок на объекты и автоматическое их освобождение отличается от того же на сервере: Закрытие и Удаление Объектов в .NET

Вы открываете множество объектов на клиенте. А потом освобождаете их на сервере или закрываете только на клиенте?

Если таблица содержит 100000 записей, Вы делаете 100000 открытий объектов.Это плохая идея.
Переписав этот код под ADO.NET вы не только избавитесь от ненужной загрузки ресурсов на сервере, но и заметно увеличите скорость работы.
Примеры кода можете посмотреть здесь .

PS:
Я руководствуюсь следующими правилами при написании клиента (не только для .NET):
1) как можно позже открывать объект/транзакцию на сервере и как можно раньше их освобождать/закрывать (работа с объектами прокси-классов производится на сервере, а ресурсы сервера драгоценны);
2) контроль администратором в Портале переменных клиентского процесса на предмет утечек ресурсов (незакрытые объекты);
3) при множестве данных использовать реляционный подход (DataSet, DataTable, TClientDataSet, java.sql.ResultSet и т.д.), а объекты только там, где это действительно необходимо;
4) по возможности отказ от динамических (свободных) запросов в пользу именованных запросов.
...
Рейтинг: 0 / 0
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
    #37270630
Vixler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И толку от объектности в каше если всё равно приходится юзать реляционные таблицы через датасеты? Тогда уж лучше создавать дубль-классы на уровне C# и использовать их для связи таблиц (например, когда в одном классе есть список объектов другого класса или отношение один-ко-многим). Просто если б можно было бы использовать сгенеренные прокси-классы в оффлайне... Типа сделал OpenId, сохранил объект в переменную obj1 в памяти вместе с id, oref и т.д., и все считывания происходят из памяти, а не из базы. Жмём obj1.Save(), весь объект сохраняется в базу. Вот меня что интересует, есть ли такой механизм, чтобы не писать дубль-класс в C# или без этого никак?
...
Рейтинг: 0 / 0
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
    #37270790
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VixlerПросто если б можно было бы использовать сгенеренные прокси-классы в оффлайне...Цитата из документации по ссылке вышеProxy objects are instances of .NET classes (source files or complete assemblies) generated from classes defined in the Caché Class Dictionary. Each proxy object communicates with a corresponding object on the Caché server, and can be manipulated just as if it were the original object .VixlerТипа сделал OpenId, сохранил объект в переменную obj1 в памяти вместе с id, oref и т.д., и все считывания происходят из памяти, а не из базы. Жмём obj1.Save(), весь объект сохраняется в базу. Вот меня что интересует, есть ли такой механизм, чтобы не писать дубль-класс в C# или без этого никак?То, что Вы просите больше похоже на Jalapeño , но это для Java.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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