我想知道是否有办法在SQL Azure中使用预定任务? 感谢每一位帮助。
关键是,我想每天运行一个简单的单行语句,并希望阻止设置辅助角色。
答案 0 :(得分:6)
今天SQL Azure没有等效的SQL代理。您必须从后台任务调用单行语句。但是,如果您已经拥有Web角色,则可以轻松生成一个线程来在Web角色中处理此角色,而无需创建辅助角色。我在博客上写了here这个概念。要生成一个线程,您可以在OnStart()事件处理程序(其中Role实例尚未添加到负载均衡器中)或Run()方法(将Role实例添加到负载中)中执行此操作平衡器)。通常在OnStart()中进行设置是个好主意。
一个可能不明显的警告,无论是在自己的辅助角色中还是在现有Web角色的后台线程中执行此调用:如果将角色扩展到例如两个实例,则需要确保每日调用仅发生在其中一个实例上(否则您可能最终会出现重复,或者多次执行可能代价高昂的操作)。您可以使用一些技术来避免这种情况,例如表行锁或Azure存储blob租约。使用前者,您可以使用该行来存储上次执行操作的时间戳。如果你获得了锁,你可以检查操作是否发生在设定的时间窗口内(可能是一个小时?),以确定其中一个实例是否已经执行了它。如果您无法获取锁定,则可以假设另一个实例具有锁定并正在执行该命令。还有其他技术 - 这只是一个想法。
答案 1 :(得分:3)
除了David的回答,如果你有很多计划任务要做,那么可能值得一看:
(您可以在David提到的线程中使用quartz.net,但是lokad.cloud需要稍微更大的架构更改)
答案 2 :(得分:2)
我希望谈论你自己的公司是可以接受的。我们有一个基于Web的服务,允许您这样做。您可以点击此链接查看有关如何schedule execution of SQL Azure queries的详细信息。
答案 3 :(得分:2)
克服了执行相同任务的多个角色的问题,您可以检查角色实例ID并确保只有第一个实例将执行任务。
using Microsoft.WindowsAzure.ServiceRuntime;
String g = RoleEnvironment.CurrentRoleInstance.Id;
if (!g.EndsWith("0"))
{
return;
}