Как создать общесистемный независимый универсальный счетчик объектов в первую очередь для ключей базы данных? - PullRequest
2 голосов
/ 05 апреля 2010

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

Объекту счетчика будет передан идентификатор, чтобы определить, какой счетчик вернуть, обработать счет, «сохранить» счет (иногда), иметь разумную производительность (как можно быстрее), возможно, способную к 1000 счетам в секунду или лучше ( 1 мс) и быть доступным кросс-процесс / вне процесса. Текущее состояние счетчика должно сохраняться между перезапусками / выключениями объекта.

Объект счетчика, скорее всего, является объектом типа «синглтон», реализованным в виде словаря со свободной резьбой, содержащего, может быть, 10 счетчиков (возможно, 50 макс.). Счет должен быть монотонным и непротиворечивым (то есть: гарантированные уникальные последовательные значения).

Каждый счетчик должен иметь несколько методов, таких как сброс, inc, dec, set, clear, remove. Как роскошь, я хотел бы иметь переменную приращения (то есть: значение «шаг за шагом»). Для поддержки потоковобезопасного, возможно, некоторого вызова критического раздела или вызова мьютекса. Ему просто нужно вернуть длинное / 4-байтовое целое число со знаком.

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

Основное использование это для ключей базы данных. Я не могу использовать ключи типа autoinc или guid и на этом этапе исключил системы подсчета, сгенерированные базой данных.

Я провел дни, исследуя это, и я действительно изо всех сил пытался найти решение. Лучшее, что я могу найти, - это объект словаря со свободным потоком, который можно создать с помощью COM + из Motobit - кажется, он предлагает все «основы», и я думаю, я мог бы создать какую-то форму обертки для этого.

Итак, вот мои вопросы:

  • Имеет ли такое «общее назначение» контр-объект уже существует? Вы можете направить меня к этому? (MS сделал сделать объект IIS / ASP под названием 'MSWC.Counter', но это не так «кросс-процесс» / вне процесса компонент и не является потокобезопасным. (но если бы это было так, то подойдет!)

  • Как лучше всего создавать такие Компонент? (Я бы предпочел VB6 Прямо сейчас, [не спрашивай!], но можно сделать в VB.NET2005 если бы мне пришлось). У меня нет навыки / знания / инструменты для использования все остальное.

Я отчаянно нуждаюсь в работоспособном решении. Мне нужно конкретное руководство! Если кто-нибудь может что-то написать для меня, я готов заплатить за это.

Обновление:

  1. Что не так с GUID? a) 16 байт, если мне повезет (двоичное хранилище), 32 + байт, если я не (ANSI без форматирования) или еще хуже (64-байтовый Unicode). б) у меня есть приложение с большим объемом репликации, где GUID слишком велик (по сравнению с фактическими данными строки) и в) накладные расходы на индексирование и вставки; г) я хочу читабельное число! - Мне нужно всего лишь 4 байта, так почему бы не попробовать это? Я знаю, что вы скажете, что дисковое пространство дешево, но для моего приложения стоимость в медленных вставках, и руководства не помогают (и я пробовал / проверял), но предпочел бы не использовать, если у меня есть выбор.

  2. Autonumber / autoincs являются злыми: a) не получают значения до окончания вставки, b) специфичны для сессии, c) легко теряются / портятся при изменении таблицы, d) бесполезны вставки таблиц (это не MS-SQL Svr) плюс мне нужны счетчики вне моей БД ...

Ответы [ 4 ]

1 голос
/ 07 апреля 2010

Я реализовал аналогичное решение, реализованное в виде веб-службы REST - доступный из любой технологии, поддерживающей http.

Простая реализация с четким внутренним интерфейсом с использованием одноэлементного шаблона и хорошо масштабируется подIIS.

1 голос
/ 05 апреля 2010

Судя по всему, вы ищете ActiveX exe. Они запускаются в своем собственном процессе, но к ним можно получить доступ из любого другого процесса, создав экземпляр объекта из него, как будто это просто еще один COM-объект. Он обрабатывает весь маршалинг, необходимый для синхронизации своего внутреннего потока с потоками любого вызывающего его процесса. Поскольку все, что вы планируете использовать, это целые, нет необходимости беспокоиться о безопасности потоков объектов, передаваемых между потоками.

Скорее всего, вы можете использовать объект MSWC.Counter в этом ActiveX exe и позволить ему выполнять работу счетчика.

1 голос
/ 05 апреля 2010

Ядро базы данных уже очень хорошо генерирует уникальные значения первичного ключа для таблицы базы данных. Либо путем пометки столбца автоинкремент или с помощью Guid. Попытка создать свой собственный - серьезная ошибка. Общесистемная система просто недостаточно широка, она терпит неудачу, когда ваше приложение растет, и более одной машины начинает использовать базу данных.

Тем не менее, вы можете получить то, что вы хотите в VB6, создав COM-сервер. Давно, я забыл точные названия опций проекта, что-то похожее на «одноразовое использование».

0 голосов
/ 06 апреля 2010

Все это звучит как извращенная идея, так почему бы мне не добавить еще одну извращенную. : P

Разместите ASP-страницу old-skool.
Тогда вы можете использовать Application.Lock со счетчиком, как в образце .
Дополнительное преимущество: используйте его с любой платформы / языка. (например, другие HTML-страницы с XMLHttpRequest .:)
Если вы сохраняете значение, скажем, каждый сотый запрос в файл, вам даже не нужно беспокоиться о сбросе IIS.
Просто установите начальное значение на last saved value + 100 в Application_OnStart. : P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...