我使用 nhibernate 作为我的网络服务的 orm,我已经实现了一个 CustomSqlDriver。我创建 CustomSqlDriver 的原因是因为我需要获取并保存在应用程序中执行的每个查询(及其参数值)到数据库。每次发生查询(选择、更新等)时都会调用 AdjustCommand 方法并按相应的顺序调用。public class CustomSqlDriver : SqlClientDriver { private static readonly log4net.ILog log = log4net.LogManager.GetLogger("CustomSqlClientDriverLogger"); private static readonly Object _lock = new Object(); public override void AdjustCommand(IDbCommand command) { base.AdjustCommand(command); var parameters = (SqlParameterCollection)command.Parameters; QueryType queryType = GetQueryType(command); string tableName = GetTableName(command.CommandText); string fullCommandText = GetFullQuery(command, parameters); Task.Run(() => { lock (_lock) { log.Info($"Trying to save the query = {fullCommandText}"); SaveToDb((int)queryType, fullCommandText, tableName); } }); }}我需要按顺序保存每个查询,因为稍后我将在不同的 FIFO 进程中使用它们。不能在同一个线程中完成(因为它可能很慢)。如您所见,我尝试在 Task.Run() 中的静态对象上使用锁,只要对任何 webmethod 的调用是同步的,就可以工作,但如果我并行调用它们,则某些行在保存时会丢失顺序到数据库。我不确定这是最好的方法 D:任何帮助将不胜感激。
1 回答
- 1 回答
- 0 关注
- 296 浏览
添加回答
举报
0/150
提交
取消