• 测试ConnectionString是否能连接上数据库服务器


    比如你要连接一个Sql Server服务器,你有一个connection string, 但是不知道是否是正确的,你可以这样:

    var connection = new SqlConnection(connectionString);

    connection.Open();

    connection.Close();

    如果整个过程中没有异常抛出,则说明connectionString是指向一个Sql Server的服务器。但是,如果connectionString里边的Data Source(或者Server)的值是错的,就要等很久——大约30秒——才能从connection.Open()这一句抛出异常。有没有办法让这个过程快一点呢?

    你可以试着在connectionString里添加上: "Connection Timeout=3",这指示超时时间为3秒。但是实际上效果还是一样的,异常仍然要在30秒之后才会抛出。

    你也可以试着用另一个线程去连接服务器,主线程在若干秒后调用该线程的 Abort()方法,但是,实验效果是行不通,因为那个线程在connection.Open()里根本出不来,无法被Abort掉。

    最后,我的解决方法还是采用后台线程,只不过如果到期尚未成功,那就当做失败,然后把它扔到一边去,不再理它了:

                //采用后台线程来连接数据库,以便在服务器输入错误的情况下,不用等待很长的时间才能得到一个错误提示
                string error = null;
                var success = false;

                // ReSharper disable AccessToModifiedClosure
                // ReSharper disable UseObjectOrCollectionInitializer
                var thread = new Thread(() =>
                                            {
                                                try
                                                {
                                                    connection.Open();
                                                    connection.Close();

                                                    success = true;
                                                }
                                                catch (SqlException ex)
                                                {
                                                    error = ex.Message;
                                                }
                                                finally
                                                {
                                                    if (connection.State == ConnectionState.Open)
                                                        connection.Close();
                                                }
                                            });
                // ReSharper restore AccessToModifiedClosure
                // ReSharper restore UseObjectOrCollectionInitializer
                thread.IsBackground = true;
                var sw = Stopwatch.StartNew();
                thread.Start();

                var timeout = TimeSpan.FromSeconds(3);
                while (sw.Elapsed < timeout)
                    thread.Join(TimeSpan.FromMilliseconds(200));
                sw.Stop();

                if (!success)
                {
                    throw new Exception(error ?? "连接数据库超时,请检查输入的服务器是否正确。");
                }

  • 相关阅读:
    使用过Redis,我竟然还不知道Rdb
    系统的讲解
    系统的讲解
    我眼中的 RPC
    Swoole Timer 的应用
    场景调研
    二维数组环求最大子数组
    《你的灯亮着吗》 阅读笔记三
    《你的灯亮着吗》 阅读笔记二
    《你的灯亮着吗》阅读笔记一
  • 原文地址:https://www.cnblogs.com/deerchao/p/1612601.html
Copyright © 2020-2023  润新知