ServiceStack OrmLite - 处理SQL Server连接丢弃的优雅方式

时间:2018-04-23 09:26:00

标签: ormlite-servicestack

我们目前正在使用ORMLite,它的效果非常好。 我们使用它的一个地方是运行大批量进程。 这些进程在一个事务中运行一个大型批处理,如果有任何错误,则它会回滚事务,然后需要再次运行。

有没有办法可以更好地处理类似连接丢弃(可能非常快)的事情,然后可以重新建立连接,然后从那里重新继续?

1 个答案:

答案 0 :(得分: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,即它不会创建新的数据库连接。