ServiceStack OrmLite - 处理 SQL 服务器连接丢失的优雅方式
ServiceStack OrmLite - Elegant way to handle SQL Server Connection Drops
我们目前正在使用 ORMLite,它运行良好。
我们使用它的地方之一是 运行 宁大批处理。
这些进程 运行 单个大批量都在单个事务中,如果有任何错误,它会回滚事务,然后需要再次 运行。
有没有一种方法可以更好地处理连接断开之类的问题(可能非常快),然后可以重新建立连接,然后从那里重新继续?
唯一类似于您所追求的东西的是使用 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
,即它不会创建新的数据库连接。
我们目前正在使用 ORMLite,它运行良好。 我们使用它的地方之一是 运行 宁大批处理。 这些进程 运行 单个大批量都在单个事务中,如果有任何错误,它会回滚事务,然后需要再次 运行。
有没有一种方法可以更好地处理连接断开之类的问题(可能非常快),然后可以重新建立连接,然后从那里重新继续?
唯一类似于您所追求的东西的是使用 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
,即它不会创建新的数据库连接。