如何在.NET中处理数据库异常

本文关键字:处理 数据库 异常 NET | 更新日期: 2024-10-20 03:32:26

我通过他们的.NET官方托管驱动程序(Nuget包)使用Oracle。

我的应用程序从一开始就使用与数据库相同的连接,并且从多个位置使用它来执行查询。

在某些情况下,可能会出现导致异常的连接"打嗝"。问题是,当这种情况发生时,我不知道重试执行查询的最佳策略是什么。

有没有一种常见的方法来解决这种情况?

谢谢。

如何在.NET中处理数据库异常

我同意哈比卜的评论。

oracle.NET包使用连接池。即使你打开了多个连接,它也会相应地管理它们,这样你就不必一直打开它。

这意味着你的代码可以被简化为类似于这样的伪代码:

using(OracleConnection conn = MakeConnection())
{
   //do stuff with connection
   //not necessary, but I always manually close connection. Doesn't hurt.
   conn.Close();
}

如果你不确定连接问题,即使是在很小的一次执行中,你也可以将其封装在一个try-catch块中,如下所示:

try
{
   using(OracleConnection conn = MakeConnection())
   {
      //do stuff with connection
      //not necessary, but I always manually close connection. Doesn't hurt.
      conn.Close();
   }
}
catch(OracleException ex)
{
    //handle exception.
}

OracleException看起来是.NET oracle包的主要异常。请注意,你可能还想更具体地抓住其他人。

在进行查询时,动态实例化连接会更容易。我认为简单的try/catch在这里对您没有帮助,因为即使您在catch块中重新初始化了连接,您也必须以某种方式重新执行查询。

我不建议这样做,但如果发现异常,可以使用Retry类重新初始化连接。。。。

public class Retry
{
    public static void Do(Action action, TimeSpan retryInterval, int retryCount = 3)
    {
        Do<object>(() =>
        {
            action();
            return null;
        }, 
        retryInterval, retryCount);
    }
    public static T Do<T>(Func<T> action, TimeSpan retryInterval, int retryCount = 3)
    {
        var exceptions = new List<Exception>();
        for (int retry = 0; retry < retryCount; retry++)
        {
            try
            {
                if (retry > 0)
                    Thread.Sleep(retryInterval);
                return action();
            }
            catch (ConnectionException ex)
            {
                // ***Handle the reconnection in here***
                exceptions.Add(ex);
            }
        }
        throw new AggregateException(exceptions);
    }
}

然后你可以像一样调用你的查询

Retry.Do(() => MyQueryMethod, TimeSpan.FromSeconds(5)); 

我很久以前就从SO那里得到了这个Retry代码的基础,不要回忆这个线程,但它不是我的原始代码。不过,我在一些事情上已经用了很多次了。