代码之家  ›  专栏  ›  技术社区  ›  robert4 DividedByZero

如何将SqlAzure重试逻辑添加到OrmLite操作?

  •  3
  • robert4 DividedByZero  · 技术社区  · 11 年前

    我想使重试逻辑透明,最好利用微软的 Transient Fault Handling Application Block ,而不是将我的代码中的每一个访问数据库的部分包装成一个重试的函数。 我能做的就是创建一个自定义 IDbConnectionFactory 产生自定义 IDbConnection 类型的对象 MySqlAzureConnection :

    MySqlAzureConnection dbConn = myConnFactory.OpenDbConnection();
    dbConn.Insert(new Employee { ...  });
    

    我有两个选择:

    • 添加一个 .Insert() 方法到 MySqlAzureConnection(MySqlAzure连接) 隐藏 与OrmLite相同的扩展方法,以提供我的重试逻辑。 实际上是我的 .Inter()(插入) 将包含完全相同的源代码 如在OrmLite中:调用 dbConn.Exec() ,但是 .Exec() 将 我的实现提供了重试逻辑。
      问题是(为了确保查询和写入 在我的程序中总是使用重试逻辑)这样我就会结束 带有副本&粘贴中的所有120+方法 [OrmSite][Read|Write]ConnectionExtensions静态类, 只是为了扩展单身人士的行为 数据库连接执行() . 听起来不太好。

    • 省略 using ServiceStack.OrmLite; 以确保不重试 OrmLite的实现不会被调用。在这种情况下,我如何使用 矿石?我将不得不一直编写完整的命名空间限定名称。 听起来也很糟糕。

    编辑:

    我意识到还有第三种选择:放弃 重试逻辑是“透明的”。换句话说,承认明确使用 在使用OrmLite的每段代码中使用包装器函数,以及 在该包装器函数中实现重试逻辑。事实上 瞬态故障处理应用程序块 做同样的事情:介绍 ExecuteCommand() ,一种新方法 (非标准 IDb连接 )并让开发人员负责 用于将其用作任何数据库访问代码的高级包装器。

    虽然这个解决方案听起来比前两个更好,但我仍然不是 对它感到满意。实体框架(6.0)已经成功地 这种弹性 透明的 ,我期待着一个类似的 解决方案。(很容易连接到OrmLite的 ReadConnectionExtensions.Exec()方法–如果它不是静态扩展 方法更好的是注射模块,因为 done in the Entity Framework ) .

    1 回复  |  直到 11 年前
        1
  •  1
  •   dandcg    8 年前

    对此做了一些进一步的研究,结果表明,从.Net 4.6.1开始,瞬态错误处理就被内置到了SqlConnection中。因此,作为Ormlite的原始Ado.net SqlConnection基础,任何自定义方法都应该是不必要的。