如何主要为数据库密钥创建系统范围的独立通用计数器对象?

问题描述 投票:2回答:4

我想创建/使用一个系统范围的独立通用“计数器对象”,该对象可以通过COM以线程安全的方式调用。

计数器对象将被传递一个ID来标识要返回的计数器,处理计数,“持久”计数(偶尔),具有合理的性能(尽可能快),也许每秒可以计数1000次或更好(1mS) ),并且可以跨进程/跨进程访问。当前计数状态必须在对象重新启动/关闭之间保持不变。

计数器对象很可能是以某种形式的自由线程字典实现的“单例”类型对象,可能包含10个计数器(最多50个计数器)。计数必须是单调且一致的(即:保证唯一的连续值)。

每个计数器应该有几种方法,例如reset,inc,dec,set,clear,remove。作为一种奢侈,我希望有一个可变的增量(即:“逐步”值)。为了支持线程安全,可能需要临界区或互斥体调用。它只需要返回一个长/ 4字节的有符号整数。

我真的很希望可以在任何地方调用它,包括VBScript,所以我认为COM是我的首选解决方案。

的主要用途是用于数据库密钥。我无法使用autoinc或guid类型的键,并且目前已经排除了数据库生成的计数系统。

我花了数天时间对此进行研究,但我一直在努力寻找解决方案。我能找到的最好的东西是一个可以使用Motobit中的COM +实例化的自由线程字典对象-它似乎提供了所有的“基本知识”,我想我可以为此创建某种包装器。

所以,这是我的问题:

  • 这样做是出于一般目的反对象已经存在?你能指导我吗? (MS做了做一个IIS / ASP对象,称为“ MSWC.Counter”,但这不是“跨进程” /进程外组件,并且不是线程安全的。 (但如果是这样,它将做到!)

  • 什么是创建这样的最好的方法一个组件? (我更喜欢VB6现在,[不要问!]但可以在VB.NET2005中进行如果我必须)。我没有技能/知识/工具其他。

我非常希望找到可行的解决方案。我需要具体的指导!如果有人可以为我编写代码,我准备为此付费。

更新:

  1. GUID有什么问题? a)如果幸运的话(二进制存储)为16个字节,如果不幸运的话(非格式化ANSI)则为32个字节甚至更糟(64字节Unicode)。 b)我有一个大量复制的应用程序,其中GUID太大(与实际行数据相比),并且c)索引和插入的开销d)我想要一个可读的数字! -我只需要4个字节的整数,那么为什么不尝试得到它呢?我知道您会说磁盘空间很便宜,但是对于我的应用程序来说,成本是插入缓慢,并且guid并没有帮助(并且我已经尝试过/测试过),但如果可以选择的话,宁愿不使用。] >

  2. Autonumbers / autoincs是邪恶的:a)在插入之后才获得值,b)特定于会话,c)容易在表更改中丢失/增加,d)对多表插入没有好处,(不是MS-SQL Svr),而且我的数据库外还需要计数器...

我想创建/使用一个系统范围的独立通用“计数器对象”,该对象可以通过COM以线程安全的方式调用。计数器对象将被传递一个ID,以标识哪个计数器...

vb.net multithreading com vb6 singleton
4个回答
1
投票

听起来,您想要创建的是ActiveX EXE。它们在自己的进程中运行,但是可以通过实例化该对象来从任何其他进程进行访问,就好像它只是另一个COM对象一样。它处理将其内部线程与任何调用它的进程的线程同步所需的所有封送处理。由于您计划使用的只是整数,因此无需担心在线程之间传递的对象的线程安全性。


1
投票

数据库引擎已经非常擅长为dbase表生成唯一的主键值。通过标记列自动递增或使用Guid。尝试创建自己的游戏是一个严重的错误。系统范围不够大,当您的应用程序增长并且一台以上的计算机开始使用数据库时,它会严重失败。


1
投票

我已经实现了作为REST Web服务实现的类似解决方案-可以从任何支持http的技术中访问。


0
投票

整个听起来像是一个扭曲的想法,所以为什么我不应该添加另一个扭曲的想法。 :P

© www.soinside.com 2019 - 2024. All rights reserved.