代码之家  ›  专栏  ›  技术社区  ›  Ashish Chaurasia

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

  •  2
  • Ashish Chaurasia  · 技术社区  · 16 年前

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

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

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

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

    我真的想要一些可以从任何地方调用的东西,包括vbscript,所以我认为com是我的首选解决方案。

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

    我花了好几天的时间研究这个问题,我真的很难找到解决办法。我能找到的最好的是一个免费的线程字典对象,它可以使用com+from实例化 Motobit -它似乎提供了所有的“基础”,我想我可以为此创建某种形式的包装器。

    所以,以下是我的问题:

    • 这样的“一般目的” 计数器对象已存在?你能告诉我怎么走吗?(MS) 执行名为 “mswc.counter”但这不是 '跨进程'/进程外 组件,不是线程安全的。(但如果是的话,就可以了!)

    • 创造这种 一个组件?(我更喜欢VB6 现在,[别问!]但可以在vb.net2005中完成 如果我必须的话)。我没有 要使用的技能/知识/工具 别的。

    我对一个可行的解决办法感到绝望。我需要具体的指导!如果有人能为我编一些代码,我愿意为此付出代价。

    更新:

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

    2. autonumber/autoincs是邪恶的:a)直到插入之后才获取值,b)特定于会话,c)很容易丢失/在表alter上出错,d)不适合多个表插入(它不是ms-sql svr),另外,我需要db之外的计数器……

    4 回复  |  直到 16 年前
        1
  •  1
  •   Corin    16 年前

    根据它的声音,您要创建的是一个activex exe。它们在自己的进程中运行,但可以从任何其他进程中访问,方法是从该进程实例化一个对象,就好像它只是另一个COM对象一样。它处理将其内部线程与调用它的任何进程的线程同步所需的所有封送处理。因为您计划使用的只是int,所以不必担心线程之间传递的对象的线程安全性。

    很可能您可以在该activex exe中使用mswc.counter对象并让它执行计数器工作。

        2
  •  1
  •   Hans Passant    16 年前

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

    不过,通过创建COM服务器,您可以在VB6中获得所需的内容。已经很久了,我忘记了项目选项的确切名称,类似于“一次性使用”。

        3
  •  1
  •   James Westgate    16 年前

    我已经实现了一个类似的解决方案,实现为一个rest web服务——任何支持http的技术都可以访问它。

    使用 singleton pattern 在iis下可以很好地扩展。

        4
  •  0
  •   Andras Vass    16 年前

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

    宿主一个旧的skool asp页面。
    你可以使用 Application.Lock 有个柜台,就像 in the sample .
    附加好处:可以从任何平台/语言使用它。(例如,其他HTML页面 XMLHttpRequest . :)
    如果将值保存在文件中,例如每100个请求保存一次,甚至不必担心iis重置。
    只需将起始值设置为 last saved value 100英寸 Application_OnStart . P