我已经安装了Quartz .NET并创建了Quartz数据库。我需要用自己的定制数据扩展Quartz作业存储。例如,当我通过Quartz API添加作业时,我需要在同一个数据库事务中向我的自定义表中添加其他信息。我知道Quartz中有一个名为JobStoreCMT的类,但是我没有找到任何简洁的示例,说明如何向Quartz提供NHibernate创建的事务。
我已经安装了Quartz .NET并创建了Quartz数据库。我需要用自己的定制数据扩展Quartz作业存储。例如,当我通过Quartz API添加作业时,我需要在同一个数据库事务中向我的自定义表中添加其他信息。我知道Quartz中有一个名为JobStoreCMT的类,但是我没有找到任何简洁的示例,说明如何向Quartz提供NHibernate创建的事务。
我对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的当前实现将升级事务为分布式事务,并在第二个连接开启时执行。这将对性能产生显着影响,因为分布式事务比简单事务慢得多。
MySqlConnector
。这样的连接器将与您的代码示例非常匹配。 - Timo