Как начать создавать доступный для поиска сборщик "мусора" в Delphi (2009-2010)

Я ищу способ управлять всеми бизнес-объектами, которые я создаю в своих приложениях, записанных в Delphi.

Как статья о EDN Причала (http://edn.embarcadero.com/article/28217) состояния, существует в основном три способа сделать это. Я главным образом интересуюсь последним, с помощью интерфейсов. Тот путь, когда на бизнес-объект больше не ссылаются нигде в приложении, это будет, избавляются от мудрой памяти (я возвращусь на этой части позже).

При создании нового бизнес-объекта было бы мудро попросить, чтобы новый диспетчер объектов, выбрал ли я уже его ранее в программе, таким образом избежал потребности повторно выбрать его от базы данных. У меня уже есть бизнес-объект в памяти, итак, почему бы не использовать ту? Таким образом мне будет нужен список доступных объектов в памяти, чтобы быть доступным для поиска (быстро).

Предоставленный код там использует "массив TObject", чтобы хранить собранные объекты, который не делает его, очень производительное касающее перерывает список объектов, после того как Вы добираетесь до определенной суммы. Я должен был бы изменить это или на TObjectList или на своего рода двоичное доступное для поиска дерево. Каков был бы лучший выбор здесь? Я уже нашел некоторый полезный код (я думаю) по http://www.ibrtses.com/delphi/binarytree.html. Разве JCL не имел материала на двоичных деревьях?

Как я обработал бы "бизнес-объекты" и "списки бизнес-объектов" в том дереве? Был бы бизнес-объект, будучи частью списка быть сосланным дважды в дереве?

Относительно избавления от объекта: Я также хочу установить своего рода TTL (время к жизни) к тому бизнес-объекту, вызывая перевыборку после определенного количества времени. Если ссылочное встречное падение к 0, я все еще хочу сохранить объект там для определенного количества времени, должен программа все еще хотеть это в TTL. Это означает, что мне будет нужен вид вида потокового цикличного выполнения монитора список объектов (или дерево) для наблюдения за удаленными будущим образом объектами.

Я также столкнулся со Сборщиком "мусора" Boehm DLL (http://codecentral.embarcadero.com/Download.aspx?id=21646).

Таким образом короче говоря, было бы мудро основывать моего "диспетчера объектов" на исходном коде, обеспеченном в статье EDN? В каком списке я хотел бы хранить свои объекты? Как я должен обработать список объектов в моем списке? И я должен все еще сохранить свой объект в памяти некоторое время и иметь его, избавляются потоковым монитором?

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

Btw, я был бы рад совместно использовать результат, чтобы другие извлекли выгоду, после того как некоторые блестящие умы уделили ему внимание.

Спасибо.

6
задан Brave Cobra 26 January 2010 в 06:27
поделиться

5 ответов

Если вы используете интерфейсы для подсчета ссылок, а затем придерживаетесь тех в коллекции некоторых сортировков, то у вас всегда будет ссылка на них. Если ваша цель - «сборка мусора», то вам нужно только один или другой, но вы, безусловно, можете использовать оба, если необходимо.

Что звучит так, будто вы действительно хотите, это кэш бизнес-объекта. Для этого вы захотите использовать один из новых универсальных коллекций коллекций . То, что вы можете сделать, это иметь TDISTARY TDICSARY COLCULDIONS, один TDISTARY для каждого из ваших типов объектов. Вы можете найти ваш главный TDIceary на перечислении или, возможно, даже на самом типе самого объекта (я не пробовал это, но это может работать.) Если вы используете GUID для ваших уникальных идентификаторов, то вы можете поставить их в один тдисформ.

Реализуйте каждый из ваших бизнес-объектов с интерфейсом. Вам не нужно использовать умные указатели, поскольку вы проектируете свои бизнес-объекты и можете спустить их от TinterfaceCoundObject. Затем ссылайтесь только на его интерфейс, поэтому его можно ссылаться.

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

Поскольку вы объединяете интерфейсы и коллекцию, то, если у вас есть ссылка на объект (через его интерфейс), и он обрезается во время очистки кэша, то объект останется живым, пока ссылка не исчезнет. Это дает вам дополнительную безопасность. Конечно, если вы все еще используете ссылку, то это означает, что вы долго сохраняли ссылку, не извлекивая его из кэша. В этом случае вы можете захотеть обновить Timestamp, когда вы тоже читаете или записывайте его. Отказ Отказ Многие из этого зависит от того, как вы будете использовать бизнес-объекты.

Насколько вероятно, вы хотите сделать это, если объект извлекается из кэша, который старше, то ограничение по региту. Таким образом, если он обрезан, прежде чем использовать его снова, вы не тратите поездки баз данных.

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

Я бы ограничил обновление объектов только к тому, когда они извлекаются из кэша. Таким образом, вы менее вероятно, измените объект, пока он использует. Если вы находитесь в середине чтения данных от объекта, в то время как он меняется, что может произвести некоторое действительно странное поведение. Есть несколько способов справиться с этим, в зависимости от того, как вы используете вещи.

Слово предупреждения об использовании интерфейсов, у вас не должно быть как объектов, так и интерфейсов, ссылаются на тот же объект. Это может привести к возмещению проблемы со ссылкой и приведенным в результате освобождения объектов, пока у вас все еще есть ссылка на объект.

Я уверен, что на это будет некоторые отзывы, поэтому выберите, что звучит как лучшее решение для вас. Отказ Отказ Отказ

Конечно, теперь, когда я написал все это, я предложу вам посмотреть какую-то стоимость бизнес-объектов. Remobjects имеет хорошую рамку, и я уверен, что есть другие.

3
ответ дан 17 December 2019 в 02:28
поделиться

Убедитесь, что сеанс не признан недействительным в вашем коде. Найдите код, аналогичный request.getSession () .invalidate ();

-121--1846394-

Я успешно использовал подход, выделенный здесь .

-121--989088-

Начать можно с смарт-указателей. Барри Келли имеет имплиментацию для D2009.

Для объектов BI в качестве ключевого поля используется guid или целое число, уникальное для всей базы данных. При загрузке объектов в память их можно хранить в словаре, используя guid в качестве ключа и объект-контейнер в качестве значения.

Объект-контейнер содержит объект bi, ttl и т.д.

Перед загрузкой объекта проверьте словарь на наличие. Если он там, проверьте ttl и используйте его, или перезагрузите и сохраните его.

1
ответ дан 17 December 2019 в 02:28
поделиться

Для очень быстрого «по имени» поиска в вашем объекте контейнера, я предлагаю вам посмотреть не на деревья, а для хэш-таблиц. Библиотека EZ-DSL (Easy Constructures) для Delphi включает в себя блок Ehash.pas, который я использую для моих контейнеров HASHING. Если вы заинтересованы в этом, я буду передать его вам.

Я склонен придумать «срок службы» ориентированных «контейнеров», которые удаляют все объекты, которые они принадлежат, когда они закрываются.

Я также думаю, что вы могли бы рассмотреть вопрос о том, что сами объекты посчитают их «полезность», имея «Flasted: Cardinal» поле данных. Вы можете назначить Flasted: = getTickCount, а затем имейте систему в основном подчиняться ограничениям, которые вы настраиваете, максимальная память или экземпляры, которые должны быть активно использованы и сколько лет должно быть объектом (не используется вообще в X Milliseconds), прежде чем он получает «демотелен» До уровня 2, уровень 3 и т. Д.

Я думаю, что для бизнес-объектов у вас есть стоимость памяти (держите ее вокруг, когда это может быть действительно только кэш), а также с согласованностью (промойте мои изменения в базу данных до Вы можете уничтожить меня) ограничение, которое делает традиционные «сборки мусора», но недостаточно, для всей проблемы руководства по жизни бизнес объекта.

1
ответ дан 17 December 2019 в 02:28
поделиться

Для точки зрения более высокого уровня, я рекомендую две книги: «Узоры архитектуры приложений предприятия» Мартина Фуэлера и Эрика Эванс Книга о дизайне, управляемой доменом, «Дизайн, управляемый доменом: божешь Сложность в сердце программного обеспечения »( http://dddcommunity.org/books#ddd ). Martin Fowler Объясняет все шаблоны для управления объектами для бизнес-приложений, включая репозитории объектов и различных стратегий отображения объектов / базы данных. Эрик Эванс Книга «... предоставляет широкие рамки для принятия дизайнерских решений ...».

Есть несколько (с открытым исходным кодом) O / R Mapper Bizeries для Delphi с активным сообществом, может быть, их исходный код также может предоставить некоторые технические рекомендации.

1
ответ дан 17 December 2019 в 02:28
поделиться

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

Может быть, вы могли бы посмотреть на http://www.danieleteti.it /? P = 199 (инверсия контрольных и зависимостей.)

0
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: