ServiceStack OrmLite - элегантный способ обработки падений подключения к SQL Server

В настоящее время мы используем ORMLite, и он работает очень хорошо. Одно из мест, где мы его используем, - для запуска больших пакетных процессов. Эти процессы запускают один большой пакет в рамках одной транзакции. Если есть какие-либо ошибки, выполняется откат транзакции, а затем ее необходимо запустить снова.

Есть ли способ, которым что-то вроде сброса соединения (которое могло бы быть очень быстрым) могло бы быть лучше обработано, и что это могло бы тогда, просто восстановить соединение и затем возобновить оттуда?

1 ответ

Решение

Единственное, что похоже на то, что вам нужно, - это использование Custom OrmLite Exec Fitler, которое вы можете использовать для внедрения своей собственной стратегии исполнения.

Пример на домашней странице OrmLite показывает пример использования фильтра Exec для выполнения каждого запроса 3 раза:

public class ReplayOrmLiteExecFilter : OrmLiteExecFilter
{
    public int ReplayTimes { get; set; }

    public override T Exec<T>(IDbConnection dbConn, Func<IDbCommand, T> filter)
    {
        var holdProvider = OrmLiteConfig.DialectProvider;
        var dbCmd = CreateCommand(dbConn);
        try
        {
            var ret = default(T);
            for (var i = 0; i < ReplayTimes; i++)
            {
                ret = filter(dbCmd);
            }
            return ret;
        }
        finally
        {
            DisposeCommand(dbCmd);
            OrmLiteConfig.DialectProvider = holdProvider;
        }
    }
}

OrmLiteConfig.ExecFilter = new ReplayOrmLiteExecFilter { ReplayTimes = 3 };

using (var db = OpenDbConnection())
{
    db.DropAndCreateTable<PocoTable>();
    db.Insert(new PocoTable { Name = "Multiplicity" });

    var rowsInserted = db.Count<PocoTable>(x => x.Name == "Multiplicity"); //3
}

Но он использует то же самое IDbConnectionто есть он не создает новое соединение с БД.

Другие вопросы по тегам