用Socket快速判斷數據庫鏈接

    你們在作項目的時候,通常都是和數據庫有關的。而相信許多人在用代碼打開數據庫的時候,沒有判斷數據庫鏈接是否成功。若是寫對了還好,可是出錯了,會等老長時間(默認15s,不過 實際響應 可能會更長)。並且還會出現卡死的狀況,給用戶的感受就會變得很是差勁。因此快速判斷數據庫鏈接是否成功,就顯得尤其重要了。
 
    通常狀況下,若是鏈接字符串正確,那麼鏈接到數據庫用的時間通常在5s之內。因此咱們能夠在鏈接字符串的最後添加一個等待時間:timeout。如:
string strCon = "Data Source=192.168.24.66;Initial Catalog=master;User ID=sa;password=123456;Connection Timeout=5";
   若是鏈接不成功,應該在5-8s內作出迴應。可是並不能肯定必定是鏈接字符串出錯。若是大量人訪問的話,極可能會出現等待時間超過5s的狀況。並且,若是鏈接不成功,咱們依舊最起碼得等待5秒。等待的滋味是很差受的,用戶必定會給你一個叉叉,因此咱們還須要用其餘辦法來快速判斷。
 
    這裏咱們用Socket來實現這一功能。(至於Socket是什麼,有興趣的朋友能夠本身查查資料)
    先用Socket來判斷與服務器是否鏈接成功,而後在進行數據庫操做。
#region 採用Socket方式,測試服務器鏈接

            /// <summary>
            /// 採用Socket方式,測試服務器鏈接
            /// </summary>
            /// <param name="host">服務器主機名或IP</param>
            /// <param name="port">端口號</param>
            /// <param name="millisecondsTimeout">等待時間:毫秒</param>
            /// <returns></returns>
            public static bool TestConnection(string host, int port, int millisecondsTimeout)
            {
                TcpClient client = new TcpClient();
                try
                {
                    var ar = client.BeginConnect(host, port, null, null);
                    ar.AsyncWaitHandle.WaitOne(millisecondsTimeout);
                    return client.Connected;
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    client.Close();
                }
            }

            #endregion
下面是數據庫的操做,能夠根據本身的狀況修改。
/// <summary>
       /// 數據庫鏈接操做,可替換爲你本身的程序
       /// </summary>
       /// <param name="ConnectionString">鏈接字符串</param>
       /// <returns></returns>
        private  static bool TestConnection(string ConnectionString)
        {
            bool result = true;

            try
            {
                SqlConnection m_myConnection = new SqlConnection(ConnectionString);
                m_myConnection.Open();

                //數據庫操做......

                m_myConnection.Close();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
                result = false;
            }
            return result;
        }
我這裏用winForm來測試的。
private void btnSocket_Click(object sender, EventArgs e)
        {
            string strCon = "Data Source=192.168.24.566;Initial Catalog=qmaster;User ID=sa;password=123456";
             
            string[] s=strCon.Split(';');
            s = s[0].Split('=');
            //獲取IP
            string strIP =s[1];

            //發送數據,判斷是否鏈接到指定ip
            if (TestConnection(strIP , 1433, 500))
            {
                 //鏈接成功
                MessageBox.Show("Socket Link Succeed","鏈接服務器");

                // 數據庫操做,我這裏用了鏈接測試。可根據你的系統自行修改
                if (TestConnection(strCon))
                    MessageBox.Show("Sql Link Succeed","鏈接數據庫");
                else
                    MessageBox.Show("Sql Link Failed", "鏈接數據庫");
            }
            else
                MessageBox.Show("Socket Link Failed","鏈接服務器");
        }

 
    用Socket來測試是否鏈接到服務器很是方便,也很是快捷,不用讓用戶等待那麼長時間,並且這樣作還能夠知道是服務器地址出錯,仍是數據庫出錯。經測試,若是數據庫地址出錯,在1-3s內便可反饋出結果。提示用戶「Socket Link Failed」。而數據庫名錯誤,則只提示「Sql Link Failed」。
    這麼方便、快捷、高效、易排錯的方法,你會不會錯過,我不知道,反正我是不會錯過了!

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。數據庫

相關文章
相關標籤/搜索