我有一个生产者消费者机制,我被迫将生产的项目存储在数据库中,这是一个要求。另外我有几个生产者和几个消费者,生产者和消费者线程将访问几个数据库表中的记录;ProcessID 列将确定哪个线程正在访问什么记录。
线程将通过 Windows 服务工作。
ProcessID 的创建出于三个原因。
1-如果线程不正常终止,则将使用 processID 来避免重新启动处理。
2-线程通过数据库锁定同步,希望我只会获得行锁,并且可能在短时间内我会有很少的阻塞线程,因为每个线程都会访问少数标有 ProcessID 的记录。
3-我想跟踪哪个线程在哪个时间做了什么,因为我正在将错误记录到数据库中。请注意,消费者会将项目发送到 Web 服务。
如果我使用 In-Memory 数组作为队列,我怀疑它是否会提高性能,它有以下缺点:-
当消费者将一个项目出队时,无论如何它都必须用它的 processID 更新它在数据库中的记录。
生产者将项目插入数据库,并使用 Output stp 参数获取其 ID,然后将项目以其 ID 放入队列中,避免从数据库中重新读取它,这是内存队列的唯一好处,避免从数据库中重新读取一个项目。请注意,一旦在数据库中插入一条记录,除了消费者之外,没有任何东西会更新它。
另一个问题是,我假设操作员可以通过从数据库中删除某个项目来停止使用它,如果我在内存队列中使用,我将失去这个未来。
Queue 类必须锁定私有对象,访问队列方法应该同步。我觉得我在复制线程将被饿死的概率。而且我觉得我正在复制线程被阻塞等待的时间。
两个问题
1-我错过了这个设计中的一些东西吗?你认为它会起作用吗?
2-不使用内存队列是个好主意吗?