2010-10-06 62 views
3

我继承了与做DB以下的操作方式散落数百次相当大的C#代码库:干净的方法来重试失败System.Data.SqlClient的操作

using (SqlConnection connection = new SqlConnection(connectionString)) { 
    SqlCommand command = new SqlCommand(queryString, connection); 
    command.Connection.Open(); 
    command.ExecuteNonQuery(); 
} 

然而,由于外界因素我的控制,数据库服务器非常残酷,特别容易出现故障,所以这些查询中很大一部分失败。鉴于这种访问数据库的特殊方式遍布在代码中,我怎样才能在一个地方编码重试,并且在任何地方都可以使用SqlCommand

的几点思考:

  • 我试图重写SqlConnection/SqlCommandExecuteNonQuery这样我就可以创建一个包装版本。不好。 SqlConnectionSqlCommand是密封的C#对象。
  • 我可以创建一个名为MySqlConnection的容器类,其中包含一个.NET SqlConnection对象,然后创建我自己的ExecuteNonQuery,然后再重试SqlCommand.ExecuteNonQuery()几次。然而,这是不好的,因为我将不得不实施每一个SqlCommand函数并且训练其他人直接使用我的包装类而不是SqlCommand。不幸的是,用户教育在这种情况下不是可接受的解决方案。我与其他被外包的开发人员卡住,经常有人离职,并且不会听我的请求使用新的SQL类。
  • 正如我之前提到的,我只是无法访问(政治和技术上)使用数据库层。这个问题的根本原因只是一个糟糕的SQL服务器设置,但我无法解决这个级别的问题。

我还有其他的选择吗?

+1

顺便说一句,你还需要在你的'SqlCommand'周围使用''。此外,FYI,'SqlClient'与C#无关 - 它是.NET的一部分。 – 2010-10-06 21:22:36

+0

实际上并不需要处理SqlCommand。它来自IDisposable的唯一原因是因为它来自Componant。 Dispose for Componant的功能是从其父站点中删除组件。所有这一切都是为了*将n下的所有东西拖放到Form *人群(即VB类型)上。 – Tergiver 2010-10-06 23:04:50

回答

3

假设一个2x4的位和飞机票的外包“合作伙伴”是出了问题,

你可能想在像postsharp(HTTP左右看看://www.sharpcrafters .com /)来制作面向方面的解决方案。基本上写一些代码,可以挂钩各种方法。然后,您可以在SqlCommand上连接事件;处置,信息和状态变化可能产量有用的,如果你是幸运

我会说,最好的解决方案来说服你的经理一个正确的代码修复是唯一的理智的解决方案。我对你的痛苦非常熟悉,但是任何允许他人编写他们的软件的公司都应该能够承担责任来验证软件的质量,或者准备忽略低质量并接受后果。

在识别真正糟糕的SQL性能代码时,可能会有里程来查看是否可以释放一些SQL服务器资源。

好运

0

你有没有想过,做你所需要的,并成为使DB调用标准简单实用的方法呢?当然,它与你的包装思想是一致的,但它不会允许离岸团队的阻力,因为他们不需要使用不同的类型。它可能只是将工作抽象到一个地方的原因。

我们需要集中我们的数据库处理等......折腾一些花哨的话给管理层......然后你走开......

好像你可以从政治立场上拉下那一个不行?

0

如果你能负担得起的开销,一种选择是写一些“DB代理”。

您的代码将指向代理(通过它的连接字符串)。代理反过来会指向实际的DB(通过它的连接字符串)。代理会拦截数据库请求,在真实数据库上执行它们,并返回结果。但是在这样做的时候,它可以实现一种算法来使查询更可靠(通过实施重试等)。

只是说。这将是一种在不改变代码的情况下实施重试的方法。