Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
|
|||
|---|---|---|---|
|
#18+
Юзаются DevExpress XtraGrid - таблицы на форме, прокси-классы для связи с базой, си-шарп. У нас используются в программах два подхода. У обоих есть свои плюсы и минусы. Хотелось бы узнать, правильно и вообще можно ли так делать. 1. Работа напрямую с классами каше. Создали классы в базе, создали прокси класс, в программе на C# получили список объектов через sql запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ...и присвоили таблице на форме этот список: Код: plaintext И всё вроде прекрасно, таблица заполняется данными, данные можно редактировать, удалять, добавлять. Но в один прекрасный момент всё начинает рушиться. Параметр Oref становится -2, дисконнект с базой, огромный красный крест на всю таблицу. Особенно часто такое встречается, когда в классе есть списки объектов других классов или отношения. В итоге код захламлён кучей Reload'ов и OpenId. Происходит это примерно так: считываем поле пару-тройку раз: Код: plaintext 1. 2. 3. 4. 5. Пример немного утрирован, но проблема именно такая - просто считывается поле, ему значения не присваиваются и через пару вызовов летят ошибки. Приходится это всё дело отлавливать, плясать с бубнами вокруг функции Reload(), заного открывать по OpenId объект, предварительно сохранив ID (который у объекта уже успел стать null), заново формировать список для таблицы... Сейчас всё вроде работает, хоть код и превратился в кашу, но кажется, что всё держится на тонкой грани, и время от времени вываливаются ошибки типа DisconnectObjectException. Короче кошмар. 2. Второй способ работает намного лучше, но заставляет фактически описывать классы дважды. Сначала в каше, потом один-в-один в C#. Считываем данные из каше, копируем данные в объекты C# и создаём список, которым заполняется таблица. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Работает, но приходится помимо дублирования класса писать много кода для синхронизации данных, контролировать обновление данных и т.п. Хотелось бы работать напрямую с классами каше через прокси-классы, но это сейчас похоже на хождение по лезвию бритвы... Может кто писал подобным образом и сталкивался с такой проблемой? Верен ли вообще такой подход (в смысле первый вариант, работа напрямую с каше классами в таблицах) или нужно что-то исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2011, 06:21 |
|
||
|
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
|
|||
|---|---|---|---|
|
#18+
Vixler , Уже глядя на код, я вижу проблемы. Работа на клиенте с подсчётом ссылок на объекты и автоматическое их освобождение отличается от того же на сервере: Закрытие и Удаление Объектов в .NET Вы открываете множество объектов на клиенте. А потом освобождаете их на сервере или закрываете только на клиенте? Если таблица содержит 100000 записей, Вы делаете 100000 открытий объектов.Это плохая идея. Переписав этот код под ADO.NET вы не только избавитесь от ненужной загрузки ресурсов на сервере, но и заметно увеличите скорость работы. Примеры кода можете посмотреть здесь . PS: Я руководствуюсь следующими правилами при написании клиента (не только для .NET): 1) как можно позже открывать объект/транзакцию на сервере и как можно раньше их освобождать/закрывать (работа с объектами прокси-классов производится на сервере, а ресурсы сервера драгоценны); 2) контроль администратором в Портале переменных клиентского процесса на предмет утечек ресурсов (незакрытые объекты); 3) при множестве данных использовать реляционный подход (DataSet, DataTable, TClientDataSet, java.sql.ResultSet и т.д.), а объекты только там, где это действительно необходимо; 4) по возможности отказ от динамических (свободных) запросов в пользу именованных запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2011, 10:05 |
|
||
|
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
|
|||
|---|---|---|---|
|
#18+
И толку от объектности в каше если всё равно приходится юзать реляционные таблицы через датасеты? Тогда уж лучше создавать дубль-классы на уровне C# и использовать их для связи таблиц (например, когда в одном классе есть список объектов другого класса или отношение один-ко-многим). Просто если б можно было бы использовать сгенеренные прокси-классы в оффлайне... Типа сделал OpenId, сохранил объект в переменную obj1 в памяти вместе с id, oref и т.д., и все считывания происходят из памяти, а не из базы. Жмём obj1.Save(), весь объект сохраняется в базу. Вот меня что интересует, есть ли такой механизм, чтобы не писать дубль-класс в C# или без этого никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2011, 04:29 |
|
||
|
C#, Cache, DevExpress, ProxyClasses. Проблема дисконнектов.
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2011, 09:43 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=37268710&tid=1557740]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 464ms |

| 0 / 0 |
