我使用 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:任何帮助将不胜感激。
相关分类