我已经安装了Quartz .NET并创建了Quartz数据库。我需要使用自己的自定义数据扩展Quartz作业存储。例如,当我通过Quartz API添加作业时,我需要在同一个数据库事务中向我自己的自定义表添加其他信息。我知道在Quartz中有一个名为JobStoreCMT的类,但是我还没有找到任何简洁的例子来展示如何为Quartz提供NHibernate创建的事务。
答案 0 :(得分:2)
我对JobStoreCMT的理解是,您使用.NET 2.0中引入的System.Transactions命名空间中的类声明所有事务。幸运的是,NHibernate也可以很好地处理这些事务,所以你可以将Quartz操作和NHibernate操作放在一个TransactionScope中,如下所示:
using (var ts = new TransactionScope()) {
// do something with your scheduler here, eg
_scheduler.ScheduleJob(someJobDetail, someTrigger);
// create an NHibernate session that will be part of the same transaction
using (var session = _sessionFactory.OpenSession()) {
// perform actions on session here, but do *not* make use of
// NHibernate transaction methods, such as ISession.BeginTransaction(),
// because the transaction is controlled via the TransactionScope instance.
}
ts.Complete();
}
上面的代码假定在其他地方声明并初始化了以下变量:
Quartz.IScheduler _scheduler;
NHibernate.ISessionFactory _sessionFactory;
上面的代码示例没有详细说明,但这是一般的想法。
您可能遇到的一个问题是上面的代码需要分布式事务,因为Quartz JobStoreCMT类创建了一个数据库连接,而NHibernate会话创建了另一个数据库连接。虽然有可能(至少使用SQL Server)有两个不同的数据库连接共享同一个事务,但我的理解是System.Transactions的当前实现将通过打开第二个连接将事务升级到分布式事务。这将对性能产生重大影响,因为分布式事务明显慢于简单事务。