gpt4 book ai didi

nhibernate - 在 NHibernate 中为长时间运行的任务确定事务和 session 的范围

转载 作者:行者123 更新时间:2023-12-03 09:45:06 25 4
gpt4 key购买 nike

在 Web 应用程序中使用 NHibernate 时,我通常会让我的 IoC 容器负责打开和关闭 ISession每个请求并提交/回滚事务。 HTTP 的性质使得在此类应用程序中定义清晰的工作单元变得非常容易。

现在,我的任务是编写一个小程序,该程序将由任务调度程序定期调用,用于发送新闻通讯。时事通讯和订阅者的概念在我们的领域模型中已经是明确定义的实体,向所有订阅者发送时事通讯将涉及到类似这样的操作:

var subscribers = _session
.QueryOver<Subscription>()
.Where(s => !s.HasReceivedNewsletter)
.List();

foreach (var subscriber in subscribers)
{
SendNewsletterTo(subscriber);
subscriber.HasReceivedNewsletter = true;
}

注意每个 Subscriber对象在循环中更新,记录她现在已收到时事通讯。这个想法是,如果邮件发送程序崩溃,它可以重新启动并从中断的地方继续发送新闻通讯。

我面临的问题是在这里定义和实现工作单元模式。我可能需要在循环的每次迭代结束时提交对数据库的更改。简单地用 using (var trans = _session.BeginTransaction()) 包裹循环体 block 似乎在运行时间上非常昂贵,而且我似乎也遇到了这个长时间运行的进程和使用相同数据库的其他(Web)应用程序之间的锁定问题。

在阅读了一些关于 NHibernate 事务的文章和文档之后,我开始思考,我可能需要从 session 中分离订阅者列表以避免锁定问题,并将每个订阅者重新附加到循环体中的新 session 。不过,我不确定这将如何提高性能。

那么,NHibernate 专家,您将如何设计和实现这样一个长期运行的工作?

最佳答案

您不想在这里使用异步持久消息传递吗?诸如 NServiceBus、Rhino 服务总线或 MassTransit 之类的东西。看来您不必尽快发送大量消息,因此我认为您应该以每个用户的 1 条持久消息异步执行

关于nhibernate - 在 NHibernate 中为长时间运行的任务确定事务和 session 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com