Я использую nhibernate как форму для моих веб-сервисов, и я реализовал 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 (), и это работает, пока вызов любого веб-метода является синхронным, но если я вызываю их параллельно, некоторые строки теряют порядок, когда они сохраняются в БД
Я не уверен, что это лучший подход. D:
Любая помощь будет оценена.