powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Пул объектов: за и против
25 сообщений из 51, страница 2 из 3
Пул объектов: за и против
    #34035805
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 Роман Дынник авторВообщето кэш ради ускорения БД - глупость
Ну я бы так не сказал...
..... повторно не запрашивать данные из БД если они не были изменены.
интересно, как ты ЭТО узнаешь?

ЭТО не надо узнавать, если все изменения объектов проходят через кэш.
Более мягкий вариант -- блокировка записи в БД, соответсвующей объекту в кэше на то время, пока объект закреплён в кэше.
Перед закреплением объекта в кэше можно повторно загрузить его из БД и заблокировать запись, можно этого не делать, если мы уверены, что запись не изменялась или нам полная когерентность кэша не важна.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34035871
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab Petro123 Роман Дынник авторВообщето кэш ради ускорения БД - глупость
Ну я бы так не сказал...
..... повторно не запрашивать данные из БД если они не были изменены.
интересно, как ты ЭТО узнаешь?

ЭТО не надо узнавать, если все изменения объектов проходят через кэш.
Более мягкий вариант -- блокировка записи в БД, соответсвующей объекту в кэше на то время, пока объект закреплён в кэше.
Перед закреплением объекта в кэше можно повторно загрузить его из БД и заблокировать запись, можно этого не делать, если мы уверены, что запись не изменялась или нам полная когерентность кэша не важна.
слишком тяжёлое решение с сомнительным результатом ( эффективностью ).
Это вам не страницы читать (сектора с HDD).
Да и подмена обязанностей сервера (не надо его жалеть - он же СЕРВЕР).

Удачи Аффтару!
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34035881
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 Petro123..интересно, как ты ЭТО узнаешь?

это техническая сторона и она менее всех интересна...
например монопольное открытие БД...задача решена ????


(круглый)
это будет интересно разработчику и архитектору ;).
Мало ли кто-что напридумывает, а потом будет вводить ограничения:
- монопольное открытие (всем только через меня)
- сложные запросы на UPDATE не слать (а то парсить неохота)
- сложные запросы на ........ не слать (а то парсить неохота)
- сложные запросы кому нужны - в след.версии.
- и т.д.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34035901
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123...Мало ли кто-что напридумывает, а потом будет вводить ограничения:
- монопольное открытие (всем только через меня)
- сложные запросы на UPDATE не слать (а то парсить неохота)
- сложные запросы на ........ не слать (а то парсить неохота)
- сложные запросы кому нужны - в след.версии.
- и т.д.

- монопольность даёт минусы и даёт плюсы - нужно парвильно оценивать задачу...более того, иногда задача этого требует...
- а зачем слать апдэйты, если есть методы у классов ? Чтоб было ??? ну тогда действительно - под ВАШУ задачу, так делать глупо...
- см. выше..
- см. выше..
- см. выше..

понимаете, Вы исходите из своих знаний и умений. Приводите очевидные примеры. почему вы считаете, что это критерий истины ???? потому что своё ? кхм... странный подход...

Давайте абстрагируемся от схем решений... Что такое сиквол ? Правильно - язык. Это то, что формализует интерфейс к БД. А никогда не задумывались - а почему он появился ??? Его плюсы и минусы ??? Тем более, что ответ Вы забираете от клиента той БД которую насилуете, без всяких искуственных языков... На клиенте только различные форматы, различные типы, обработка коллекций и прочая шняга... Давайте помечтаем... А если убрать язык ? Без него мона ? скорее всего да, чем нет. и посчитайте плюсы и минусы получаемого решения... Дело реализации и техники, хотите Вы этого или нет.. Просто дело за малым - временем...

последний абзац - так - писча для хвоста...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34035954
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0А если убрать язык ? Без него мона ? скорее всего да, чем нет
Можно. Такие решения использовались в начале семидесятых, пока их не вытеснили RDBMS с языком.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34035964
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Роман ДынникА по-моему автор не сказал что эксклюзивная блокировка на чтение требуется.
А по-моему, сказал:

надо тормозить один поток, пока с кешем работает другой.
И позже подтвердил.

Alex SМожет, я что-то недопонимаю, но как я буду из разных потоков (TThread) обращаться к одному глобальному экземпляру классу и что-то в нем искать? Такие вещи как критические секции, обычно и обеспечивают ...
Прочитайте книгу дальше первых страниц. Или задумайтесь над тем, как работает тот же MSSQL, когда допустим сто клиентов одновременно просят у него данные (в наиболее интересном случае - просят у него результаты одного и того же долгого запроса).

Думаю внутри sqlservr.exe выполняется N потоков, которые теми-же механизмами (синхронизацией потоков) обращаются к общим ресурсам
ну типа пула планов запросов. Насчет долгого запроса - выигрыш от небольшой задержки от синхронизации при обращении к пулу планов запросов оказывается существеннее чем заново строить план.

softwarer Alex S> А вот это напрягло бы меня куда больше, нежели какие-то кэши.

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

Ну значит оставим по одному соединению на поток. :)
Правда осталось не понятным что изначально напрягло....

softwarer Alex SСчитайте мой сервер приложений аналогом оракловой службы TNSListener (чем она не третье звено в _классической_ клиент-серверной архитектуре? :) )
Всем. Не стоит щеголять грамотностью там, где ни фига не разбираетесь.

Впрочем, можете провести эксперимент. Запустите программу, вырубите TNS Listener и увидите, что программа продолжает нормально работать. Когда добьетесь такого же результата от своего аппсервера, приходите.
Ну хорошо, неудачный пример, не надо злиться :) Возьмем для примера
SSNETLIB.DLL от MSSQL. Честно говоря, у меня уже нет уверенности, что если ее тоже как-нибудь вырубить, то подключения по сокетам к серверу не остануться :) Но суть я думаю понятна. Мне нужен этот "драйвер" - он выполняет те задачи, про которые я написал. SSNETLIB.DLL выполняет свои задачи, мой СП - свои. В чем ущербность подхода?

Petro123 mcureenab Petro123 Роман Дынник авторВообщето кэш ради ускорения БД - глупость
Ну я бы так не сказал...
..... повторно не запрашивать данные из БД если они не были изменены.
интересно, как ты ЭТО узнаешь?

ЭТО не надо узнавать, если все изменения объектов проходят через кэш.
Более мягкий вариант -- блокировка записи в БД, соответсвующей объекту в кэше на то время, пока объект закреплён в кэше.
Перед закреплением объекта в кэше можно повторно загрузить его из БД и заблокировать запись, можно этого не делать, если мы уверены, что запись не изменялась или нам полная когерентность кэша не важна.
слишком тяжёлое решение с сомнительным результатом ( эффективностью ).
Это вам не страницы читать (сектора с HDD).
Да и подмена обязанностей сервера (не надо его жалеть - он же СЕРВЕР).

Удачи Аффтару!

Ну зачем блокировать-то ! ??? Можно узнать по дате изменения: если в кеше она равна той что в базе - можно использовать кеш, если более новая - нужно перечитать этот объект в кеше. Дату читать быстрее чем весь объект целиком.

Впрочем в моем случае еще проще: шаблоны отчетов и т.п. меняются в базе только при смене версии. Процедура смены версии выставлет флаг в базе (дату/время версии) которую проверяют другие потоки в нужные моменты и, если она отличается от ранее считанной - чистят кеш и перечитывают дату версии.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036006
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно узнать по дате изменения
Я узнаю по полю GUIDLastChange (guid последнего изменения храним).
Типовое решение для MSSQL - поля timestemp.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036017
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
к сожалению не совсем тесно знаком с указанными системами, но сдаётся мне, что кэш там организован не с "сырыми" данными из БД... А каким то макаром сгрупированные по определённой бизнес логики, в данном контексте слоя...

нет, именно с сырыми.
Часто также в ORM используется двухуровневый кеш объектов:
1-ый - кеш апп-сервера, 2-ой - кеш клиента.
кеш - обычная глобальная коллекция объектов разных типов, поиск в которой производится по ключу.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036021
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторне с "сырыми" данными из БД...
т.е. я имею в виду кеш - это уже готовые объекты на которые помапплены данные из БД.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036074
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer kolobok0А если убрать язык ? Без него мона ? скорее всего да, чем нет
Можно. Такие решения использовались в начале семидесятых, пока их не вытеснили RDBMS с языком.

А в середине 90х народ просёк, что программировать на двух языках, всё равно как сидеть на двух стульях и предложил ODBMS и объектный API, где для программирования SQL нужен в значительно меньшей степени.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036092
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Alex S
>Заинтересовал меня такой концептуальный :) вопрос...

Продолжаю искать (уточнять) решение задачи, почти аналогичной Вашей. Текущие (на то время) результаты опубликованы здесь:
http://www.gotdotnet.ru/LearnDotNet/NETFramework/223738.aspx
Подключаю удаленных клиентов к пулу СП.

С уважением, Владимир.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036096
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex SНу зачем блокировать-то ! ??? Можно узнать по дате изменения: если в кеше она равна той что в базе - можно использовать кеш, если более новая - нужно перечитать этот объект в кеше. Дату читать быстрее чем весь объект целиком.

Блокировать нужно для того, чтобы при сохранении кэшированного объекта не затереть изменения сделанные кем то другим. Если объект используется только для чтения, то блокировать скорее всего не нужно, но тогда и закреплять объект в кэше тоже не нужно.
Читать дату не на много быстрее чем объект, в прочем если дата (а ещё лучше некий серийный номер, который инкрементируеся при каждом изменении записи) не изменилась, то можно немного сэкономить на трафике. На системном уровне я таких решений не встречал. Обычно в кэш просто считывается объект из БД без всяких проверок.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036099
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabА в середине 90х народ просёк, что программировать на двух языках, всё равно как сидеть на двух стульях
Раньше. К середине 90-х Oracle Forms был кажется уже четвертой, что ли, версии.

mcureenabи предложил ODBMS и объектный API, где для программирования SQL нужен в значительно меньшей степени.
И мы уже десять лет наблюдаем победное шествие ODBMS. Вот только они что-то даже на горизонте не показываются. Прочие комментарии, наверное, стоит опустить.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036133
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab Alex SНу зачем блокировать-то ! ??? Можно узнать по дате изменения: если в кеше она равна той что в базе - можно использовать кеш, если более новая - нужно перечитать этот объект в кеше. Дату читать быстрее чем весь объект целиком.

Блокировать нужно для того, чтобы при сохранении кэшированного объекта не затереть изменения сделанные кем то другим. Если объект используется только для чтения, то блокировать скорее всего не нужно, но тогда и закреплять объект в кэше тоже не нужно.
Читать дату не на много быстрее чем объект, в прочем если дата (а ещё лучше некий серийный номер, который инкрементируеся при каждом изменении записи) не изменилась, то можно немного сэкономить на трафике. На системном уровне я таких решений не встречал. Обычно в кэш просто считывается объект из БД без всяких проверок.
Нет!!, блокировать не нужно, чтобы не затереть изменения, сделанные кем-то другим. Чтобы не затереть нужно выполнять update при изменении по двум ключам: ID изменяемого объекта и _ДАТЕ_ПОСЛЕДНЕГО_ИЗМЕНЕНИЯ_ изменяемого объекта.В качестве значения даты передавать то, которое считано в момент чтения объекта. Если количество затронутых оператором update записей (RowsAffected) равен 1, то обьект благополучно изменился так как даты в таблице и параметре update совпали (Т.Е. объект никто на поменял пока мы с ним работали) Если равен 0 - то объект был изменен, но в этом случае мы ничего и не затерли. Дальше зависит от логики.

Разумеется вместо даты последнего изменения можно использовать GUID - просто он имхо несет меньше "смысловой нагрузки" (банально узнать когда было последнее изменение).Да и байт в нем больше - поиск медленнее ;)

Чиать дату намного быстрее чем объект. Например, шаблон отчета может весить до 3~5 Mb, кроме того чтение BLOB (у меня шаблоны хранятся BLOB полях) подразумевает дополнительные низкоуровневые операции.

Кроме того, кроме непосредственно чтения происходит меппинг содержимого таблиц в иерархии классов (в случаях, более сложных чем шаблон отчетов) Выгоднее один раз это проделать и положить экземпляр "заполненного" класса в кеш. При выборе из кеша происходит простое копирование свойств экземпляра класса в другой экземпляр (Assign).

ВМоисеев>Alex S
>Заинтересовал меня такой концептуальный :) вопрос...

Продолжаю искать (уточнять) решение задачи, почти аналогичной Вашей. Текущие (на то время) результаты опубликованы здесь:
http://www.gotdotnet.ru/LearnDotNet/NETFramework/223738.aspx
Подключаю удаленных клиентов к пулу СП.

С уважением, Владимир.
спасибо, обязательно посмотрю
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036497
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал с утра ветку. Хочу ответить, уточнить...

Petro123ЗЫ. Чем шаблоны отчётов лучше остальных данных получаемых с сервера - непонятно.

1)Они редко меняются
2)Данные из таблицы, где записаны отчеты не используются нигде, кроме непосредственно считывания шаблона, перед запуском шаблона на выполнение.

Шаблоны отчетов, описания атрибутов, форм и т.п. являются чем-то вроде объектов конфигурирования функционала. Ну т.е. в классическом приложении они должны были бы быть "вкомпиленными" в exe, но у меня лежат в базе. Плюсы такого подхода:
1) смена версии = update и insert по базе
2) неограниченное расширение функционала при неизменности exe
3) оперативность внесения изменений
Минус: требуется время на выборку и интерпретацию информации из базы.
С помощью кеширования я минимализирую "минус" :)

softwarer
С каких это пор чтение из кэша стало требовать эксклюзивной блокировки, да еще и на уровне кэша в целом?

У меня сейчас закрались подозрения, что я не достаточно точно объяснил, что я собирался синхронизировать (блокировать).

Не операции чтения БД, совсем нет.
Я говорю про синхронизацию при доступе к объекту класса "глобальный кеш" из потоков (нитей, Thread) _внутри_ exe сервера приложений.

Ну типа есть такой класс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
TGlobalCache=class(TObject)
private
  FList:TObjectList; // список указателей на хранимые объекты
public
  function GetItem(const aUID:string):TCachedInfo;//выбрать из кеша
  procedure StoreItem(aInfo:TCachedInfo);//положить в кеш
...
end;

и есть экземпляр этого класса ОДИН на несколько потоков.

Код: plaintext
MyGlobalCache:TGlobalCache;

Любой поток будет вынужден войти в критическую секцию, для того чтобы вызвать метод GetItem (найти информацию в кеше). Вы скажете, что операцию чтения в данном случае не надо синхронизировать? Но ведь даже при поиске меняется содержимое памяти, например по указателю переменной счетчика цикла, когда я буду перебирать объекты в списке FList для того чтобы найти нужный. А если меняется содержимое памяти, то такой код нужно защищать от угрозы изменения ее одновременно из двух потоков.

Сейчас у меня _каждый_ поток имеет свой экземпляр класса TGlobalCache, и если несколько потоков работают с одной конфигурацией (а-ля одной БД), то велика вероятность что у каждого потока в кеше есть объекты, присутствующие в кеше других потоков - а значит в общей памяти приложения.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036571
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex SУ меня сейчас закрались подозрения, что я не достаточно точно объяснил, что я собирался синхронизировать (блокировать).
Не беспокойтесь, сейчас Вы объяснили в точности то же, на что я отвечал. И девятнадцать часов назад Колобок уже рассказал Вам, как это следует делать.

Alex SЛюбой поток будет вынужден войти в критическую секцию, для того чтобы вызвать метод GetItem
Глупость, этого совершенно не требуется. Другой вопрос, что при описываемых Вами параметрах использования кэша такой грубой синхронизации вполне может хватить без заметного ущерба эффективности - если поиск объекта в кэше быстрый.

Alex SВы скажете, что операцию чтения в данном случае не надо синхронизировать?
Я скажу, что если бы принимал у Вас экзамен, поставил бы Вам тройку. Точнее, благодаря вот этому:

Alex SНо ведь даже при поиске меняется содержимое памяти, например по указателю переменной счетчика цикла,
.. я бы выбрал базовой оценкой двойку, но за желание думать и таки знание, что такое критические секции добавил бы балл.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036745
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Alex SУ меня сейчас закрались подозрения, что я не достаточно точно объяснил, что я собирался синхронизировать (блокировать).
Не беспокойтесь, сейчас Вы объяснили в точности то же, на что я отвечал. И девятнадцать часов назад Колобок уже рассказал Вам, как это следует делать.

Alex SЛюбой поток будет вынужден войти в критическую секцию, для того чтобы вызвать метод GetItem
Глупость, этого совершенно не требуется. Другой вопрос, что при описываемых Вами параметрах использования кэша такой грубой синхронизации вполне может хватить без заметного ущерба эффективности - если поиск объекта в кэше быстрый.

Alex SВы скажете, что операцию чтения в данном случае не надо синхронизировать?
Я скажу, что если бы принимал у Вас экзамен, поставил бы Вам тройку. Точнее, благодаря вот этому:

Alex SНо ведь даже при поиске меняется содержимое памяти, например по указателю переменной счетчика цикла,
.. я бы выбрал базовой оценкой двойку, но за желание думать и таки знание, что такое критические секции добавил бы балл.
Что за пафосный тон? Форум существует для того, чтобы принимать экзамены или помочь разобраться в проблеме?

kolobok0
2) синхронизация требуется для доступа к данным, которые могут быть изменены. Например кол-во элементов в списке, сами данные в списке, некие глобальные данные и прочая муть... На чтение, если объект кэша существует -А я про что ?
Alex SЛюбой поток будет вынужден войти в критическую секцию, для того чтобы вызвать метод GetItem


Сам разберусь.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036910
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex SПеречитал с утра ветку. Хочу ответить, уточнить...

Petro123ЗЫ. Чем шаблоны отчётов лучше остальных данных получаемых с сервера - непонятно.

1)Они редко меняются
2)Данные из таблицы, где записаны отчеты не используются нигде, кроме непосредственно считывания шаблона, перед запуском шаблона на выполнение.

вы не задумывались, где остальные смертные хранять "тяжёлые отчёты"? Причём с обновлением версии на сервере? И без всякого промежуточного сервера, кэша, блокирования, ...... зарплаты разработчика/программиста/внедренца/обслуженца.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34036966
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex S kolobok0
2) синхронизация требуется для доступа к данным, которые могут быть изменены. Например кол-во элементов в списке, сами данные в списке, некие глобальные данные и прочая муть... На чтение, если объект кэша существует -А я про что ?
Alex SЛюбой поток будет вынужден войти в критическую секцию, для того чтобы вызвать метод GetItem
Вы - не про то. Колобок - про синхронизацию, Вы - про синхронизацию критической секцией. Разницу между этими вариантами легко увидеть на примере стандартного класса дельфы TMultiReadExclusiveWriteSynchronizer.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34070022
Фотография -=*ShamaN*=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такие мысли тоже есть...
Но... если кэшировать большие объемы - это будет накладно...
Так целесообразно сделать справочники например: запросить и хранить в памяти до первого требования

То, о чем идёт речь - обычный брокер сущностей базы данных
Здесь думаю более приемлемо кэшировать только те объекты, которые заблокированы, таким образом вести списки блокировок.

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

Теперь, если клиент открывает на чтение залоченный кем то объект, он автоматом подписывается на нотификацию о смене состояния этого объекта, на экране это будет выглядеть. Первый его разблокирует, второй считывает новую обновленную инфу по объекту и кидает в форму, при этом ReadOnly контролов снимается. При отключении клиента соответственно все таблицы блокировок по этому клиенту очищаются.

PS/ Ув. Alex_S, могу выслать ядро нашей системы, там сокеты, многопоточность и DLL, если надо.
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34070112
Фотография -=*ShamaN*=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, не в тему что-то рубанул
глобальный кеш делать есть смысл

выглядеть будет примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
TSemaphore - класс (обёртка над виндовым семафором, сделаете сами)


procedure XXX.GetItem(AName: String; AStream: TStreaM); 
var
  I: Integer
begin
  FSemaphore.WaitFor; // ждём окончания блокировки
  InterlockedIncrement(EntryCount);  // Увеличиваем счетчик текущих потоков
  try
    I := FList.IndexOf(AName);
    if I <> - 1  then
      LoadItem(I, AStream); 
  finally
    InterlockedDecrement(EntryCount)
  end;
end;

Procedure XXX.AddItem(AName: String; AStream: TStream);
begin
   FSemaphore.Lock; // После этого все входящие потоки поиска осядут на семафоре
   try
     WaitForZeroEntryCount; // Здесь надо подождать, пока отрабоают все потоки, которые нашли запись кеша и грузят данные из списка, по сути это условие EntryCount =  0 , но более правильно сделать также через семафор со счетчиком блокировок
      SaveItem(AName, AStream);
  finally
    FSemaphore.Unlock; // Здесь все потоки, которые ждали, ломанутся в список :)))
  end;
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34070116
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=*ShamaN*=-
сказочка:
- был клиент Иванов и магазин, где хлеб продавали.
Так вот, периодически Иванов приходил в магазин, чтобы узнать: "Завезли новый хлеб или нет?".
Но тут пришли Искушатели и уговаривают Иванова: "Зачем тебе ходить всякий раз? Давай ты у нас будешь спрашивать?". А мы тут кэш держать будем. Причём на все булки сразу. И на носки тоже......
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34070146
Фотография -=*ShamaN*=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 -=*ShamaN*=-
сказочка:
- был клиент Иванов и магазин, где хлеб продавали.
Так вот, периодически Иванов приходил в магазин, чтобы узнать: "Завезли новый хлеб или нет?".
Но тут пришли Искушатели и уговаривают Иванова: "Зачем тебе ходить всякий раз? Давай ты у нас будешь спрашивать?". А мы тут кэш держать будем. Причём на все булки сразу. И на носки тоже......
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!

Не в тему
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34072018
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вы не задумывались, где остальные смертные хранять "тяжёлые отчёты"? Причём с обновлением версии на сервере? И без всякого промежуточного сервера, кэша, блокирования, ...... зарплаты разработчика/программиста/внедренца/обслуженца.
Боюсь предположить: там-же - в базе ? Причем тут моё желание ускорить процесс "предоставления" их "клиенту"? Нет, не поймите меня неправильно: не сделать так же быстро как у других смертных, а сделать _быстрее_ чем у них. Я с промежуточным сервером думаю что могу это сделать. Могут ли остальные смертные - не знаю. И внедренцы/обслуженцы тут при чем?
softwarer
Вы - не про то. Колобок - про синхронизацию, Вы - про синхронизацию критической секцией. Разницу между этими вариантами легко увидеть на примере стандартного класса дельфы TMultiReadExclusiveWriteSynchronizer.
Да, разобрался. Спасибо

-=*ShamaN*=-Пардон, не в тему что-то рубанул
глобальный кеш делать есть смысл

выглядеть будет примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
TSemaphore - класс (обёртка над виндовым семафором, сделаете сами)


procedure XXX.GetItem(AName: String; AStream: TStreaM); 
var
...
 

Похоже принцип тот-же. Ну то-есть блокировать только запись.
Пришлось кое-что переделать/упростить, но сделал.
Спасибо
...
Рейтинг: 0 / 0
Пул объектов: за и против
    #34073163
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex S не сделать так же быстро как у других смертных, а сделать _быстрее_ чем у них.
Я с промежуточным сервером думаю что могу это сделать. Могут ли остальные смертные - не знаю. И внедренцы/обслуженцы тут при чем?
для этого обычно пишут в таком виде:

авторПроблема: AAAAAAAAAA

Решение № N (для 2-х звенки): BBBBBBBBBBBBB

Недостаток стандартного подхода: Например при 2-х звенке отчёт размером N килобайт обновляется раз в месяц за время N-сек. ОООчень долго.

Предлагаемый подход на основе 3-х звенки: CCCCCCCCCCCCCC
это IMHO стандартный подход, и его можно сразу в FAQ при желании.

А так - велосипеды и неконкретный трёп IMHO
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Пул объектов: за и против
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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