2

我需要一种经常运行的方法来进行一些数据库处理。但是,我可能需要它可以由站点上的管理员触发。但我不希望此方法同时运行多次,因为这可能会导致它访问数据库的方式出现问题。

例如,我可以...

创建一个在计时器上运行该方法的单例类,并在 global.asax 文件中对其进行实例化。然后,由于它是一个单例,我可以从我的普通 .aspx 页面调用它,并在需要时调用该方法。我可能需要使用 C# 的“锁定”功能来检查该方法是否已经在运行。

我最近听到有人说单身人士是“邪恶的”,但这似乎是完美的契合。你怎么看?提前致谢。

4

7 回答 7

8

计时器和锁(旨在同步对数据库的访问)在 Web 上是个坏主意;您可能在不同的服务器上有零个、一个或多个应用程序池。它们可以随时回收,并且在需要时不会旋转。基本上,这不会阻止您从多个来源敲击数据库。

就个人而言,我很想写一个服务来完成这项工作(db-polling,或通过 WCF 等),或者使用 db(一个 SP 或类似的) - 在表行中设置一个标志说“进行中”,在数据库中进行工作,并清除标志(重复尝试在进行中立即退出)。

于 2009-03-20T13:40:55.700 回答
1

我会这样做

  1. 构建一个正常的 ASP.NET 页面来进行处理
  2. 窃取借用LFSR Consultings的想法,在数据库中设置一个标志,用于检查进程当前是否正在运行
  3. 使用普通的 cronjob 或 windows 任务调度程序定期调用网页。

单身人士并不邪恶,他们只是很容​​易被虐待。

于 2009-03-20T13:45:28.607 回答
1

Joel Spolsky 在 SO Podcast 中提到的另一个选项,我相信它是 #20 的东西。就是在应用程序开始时设置一个空的Cache对象,并在某个过期日期,并在CacheItemRemovedCallback中调用页面或做一些工作,然后重置空的缓存对象。

我可能非常错误地引用了他的话,所以我建议您自己或查看成绩单。

于 2009-03-20T14:00:43.343 回答
0

仅仅在数据库中设置一个标志并检查它以确定作业是否正在运行呢?似乎更简单的国际海事组织。

于 2009-03-20T13:40:01.147 回答
0

编写单例的规范方法最终不是线程安全的。尤其是在 webby 环境中,线程甚至不需要在同一台机器上!

如果您真的想做一个“单例”,请将其视为您只部署到一台机器的服务。然后使用 Marc Gravell 建议的数据库的事务语义来同步锁。

于 2009-03-20T13:48:30.313 回答
0

我们通过使用 Web 服务进行后端处理,然后编写一个桌面应用程序来按照我们需要的任何时间表调用它来完成类似的事情。然后我们可以在服务器上运行该应用程序,或者管理员可以直接从他们的 PC 运行它来触发作业。

编辑:在我看到您不希望它们同时运行的修订后,我们通常只是使用数据库标志来控制它,就像其他一些人所说的那样,没什么特别的,但它完成了工作

于 2009-03-20T13:48:55.553 回答
0

设置一个应用程序范围的变量来表示该进程正在运行。这应该比将变量存储在数据库中要容易一些,对吧?

于 2009-03-20T14:42:01.653 回答