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

时间:2010-04-05 14:32:01

标签: vb.net multithreading com vb6 singleton

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

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

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

每个计数器应该有一些方法,如reset,inc,dec,set,clear,remove。作为一种奢侈品,我希望有一个可变增量(即:'逐步'值)。为了支持线程安全,可能是一些关键段或互斥调用的sorm。它只需要返回一个long / 4byte有符号整数。

我真的想要可以从任何地方调用的东西,包括VBScript,所以我觉得COM是我首选的解决方案。

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

我花了几天时间研究这个问题,而且我一直在努力寻找解决方案。我能找到的最好的是一个自由线程字典对象,可以使用来自Motobit的COM +进行实例化 - 它似乎提供了所有'基础',我想我可以为此创建某种形式的包装器。

所以,这是我的问题:

  • 这样的'通用目的 反对象已经存在?你能指导我吗? (MS做到了 做一个名为的IIS / ASP对象 'MSWC.Counter',但事实并非如此 '跨进程'/进程外 组件,不是线程安全的。 (但如果是的话,就会这样做!)

  • 创建此类广告的最佳方式是什么 一个组件? (我更喜欢VB6 现在,[不要问!]但可以在VB.NET2005中完成 如果我不得不)。我没有 技能/知识/工具使用 其他任何事情。

我绝对是一个可行的解决方案。我需要具体的指导!如果有人可以为我编码,我准备支付它。

更新

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

  2. Autonumber / autoincs是邪恶的:a)直到插入之后才得到该值,b)特定于会话,c)容易丢失/搞砸了表格,d)没有任何好处表插入,(它不是MS-SQL Svr)加上我需要在我的DB之外的计数器......

4 个答案:

答案 0 :(得分:1)

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

尽管如此,您可以通过创建COM服务器来获得VB6中的所需内容。很长一段时间,我忘记了项目选项的确切名称,类似于“一次性使用”。

答案 1 :(得分:1)

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

很可能你可以在那个ActiveX exe中使用MSWC.Counter对象并让它进行反作用。

答案 2 :(得分:1)

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

使用singleton pattern进行简单的后端实现,并且可以在IIS下很好地扩展。

答案 3 :(得分:0)

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

托管一个旧的skool ASP页面 您可以将Application.Lock与计数器一起使用,就像in the sample一样 增加的好处:从任何平台/语言使用它。 (例如其他带有XMLHttpRequest的HTML页面。:) 如果将值保存在每100个文件请求中,则甚至不必担心IIS重置 只需在Application_OnStart中将起始值设置为last saved value + 100即可。 :P