【问题标题】:Pattern to access database from multiple processes从多个进程访问数据库的模式
【发布时间】:2017-03-01 04:10:09
【问题描述】:

我有一个用 C# 编写的 Windows 调度程序服务,它从数据库中查询一堆记录,对数据执行一组操作并将这些记录更新回数据库。我现在需要将此服务部署在多台机器上。但是,我最终会遇到的明显问题是并发性。在多台机器上运行的服务不应获取相同的记录。是否有适合这种情况的模式/最佳实践? 我正在使用 Oracle 11g 数据库。

在使用多线程方法处理记录后,我们已经达到了性能的最大极限。为了获得更高的性能,我们正在考虑在多台机器上运行该服务。

【问题讨论】:

  • 在我看来,您可以使用存储过程——一旦执行——将相应的实体标记为“进行中”或其他东西(必须锁定以便另一个存储过程调用不能中断) 或通过编写一个代理来访问处理多访问内容的数据库。
  • 如果它做同样的事情,你为什么要将它部署到多台机器上?这有什么真正的好处吗?从你的描述来看,你已经在惹麻烦了:)
  • @Markus Safar,我正在考虑您提到的类似线路,但无法找到锁定状态更新的最佳方法。

标签: c# design-patterns deployment windows-services


【解决方案1】:

您需要以编程方式维护并发性。

  1. 您可以在表(记录)中使用状态列来描述记录是已处理、处理中还是未处理。
  2. 您可以使用表(记录)中的行版本/时间戳,以防您希望避免其他事务更新相同的值。 (考虑 MS-SQL Server 系列)

我们能知道在多台机器上提供服务的原因吗?如果您的答案在于性能,那么您可以使用任务/多线程等来实现相同的目标。

【讨论】:

  • 感谢您的回复。使用多线程处理记录后,我们已经达到了最大限制。为了获得更高的性能,我们正在考虑在多台机器上运行该服务。即使我们使用状态列,当多个进程尝试更新状态列时,我们不会遇到并发问题。
  • 对于并发问题,答案是yes和no。请参阅时间戳用于并发检查和锁定,您可以使用具有适当隔离级别的事务。如果表查询比率太频繁,那么要注意使用高(可序列化)隔离级别
猜你喜欢
  • 2016-07-21
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多