2016-05-30 106 views
1

我有一個很奇怪的問題,並希望有人在那裏有類似的經歷。.NET SQL Server連接問題 - 也許連接池相關

我的公司申請的一個客戶端在我們的應用程序開始時就被SQL Server「禁止」了。行爲很奇怪。我會以點形式寫出來。

創建SQL連接,檢索數據,關閉連接,與其他數據源交談,然後拒絕訪問SQL Server。

這裏的長篇大論版本:

.NET應用程序連接到數據庫多次。獲取一些數據,做一些工作。然後它會獲得更多的數據,然後出現「SQL Server無法找到或訪問被拒絕」的錯誤。如果在不重新啓動應用程序的情況下再次啓動該進程,則不能再向SQL Server連接。所有新的連接都會導致「無法找到SQL Server或訪問被拒絕」。如果應用程序重新啓動,那麼它將重複上述過程。

這是5年來我第一次遇到這個問題。該應用程序確實有用Delphi 7編寫的代碼.Dephi 7/VBA代碼沒有問題。我的.NET代碼執行實際查詢如下所示:

protected abstract DbConnection GetConnection(); 
    protected abstract DbDataAdapter GetDataAdapter(DbCommand cmd); 
    protected abstract DbCommand GetCommand(DbConnection conn, String sql); 
    protected abstract DbCommandBuilder GetCommandBuilder(DbDataAdapter adapter); 

    public virtual DataTable Query(string sql) 
    { 
     var dt = new DataTable(); 

     using (var conn = GetConnection()) 
     { 

      try 
      { 
       using (var cmd = GetCommand(conn, sql)) 
       { 

        using (var adapter = GetDataAdapter(cmd)) 
        { 
         adapter.Fill(dt); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new SqlStatementException(sql, ex); 
      } 
     } 

     return dt; 
    } 

這是我自己非常髒的DAL。當它使用它使用OleDbConnection。

注意:由於遺留代碼,連接字符串配置爲OleDbConnection。花點時間檢查我的代碼後,我確實有能力將連接類型更改爲SqlConnection。我還沒有嘗試過。

在客戶端的機器上,我一直無法在主應用程序之外重現問題。我嘗試創建一個小應用程序,使用上面的格式使用OleDbConnection將100個調用背對背,但它成功執行。

主應用程序的失敗發生在同一個地方。這應該給我一個線索,除非我無法理解它,因爲它正在進行重複查詢,獲取相同的數據。但我會說應用程序會與兩個數據源對話並將數據從一個數據源傳輸到另一個數據源。在它進行轉移之前,它對源代碼進行了一些驗證。因此,它通過ODBC與另一個數據庫(基於專有文件)進行通信,併成功返回,然後在嘗試通過OleDbConnection與SQL Server交談時失敗。

我的懷疑是在連接池中發生的事情。這導致了失敗,從而導致拒絕訪問。

其他有趣的一點。所有的工作都很好,大約一年前,客戶在幾個月前買了一臺新機器,一切正常,然後突然停下來。我把應用程序放在客戶端的另一臺機器上,一切都運行良好,然後出現了同樣的問題。我們在客戶端的機器上關閉了所有東西,但問題依然存在。我認爲防火牆,但沒有運氣。

任何幫助,非常感謝。

+0

驗證SQLSERVER沒有t將其進行更改爲連接未在此代碼關閉。另外,如果服務器不接受多個連接,那麼這將成爲連接到同一服務器上的多個數據庫的問題 – Shon

+0

@Shon:using語句關閉連接。澄清一個數據源在一臺服務器上,另一個數據源在另一臺服務器上。雖然在同一臺服務器上應該不成問題。 –

+0

我不太瞭解,但我不認爲連接池問題會帶來這樣的信息。 「無法找到SQL Server或訪問被拒絕」。但是,您的懷疑在某些觀點上也是有道理的。詞「新機」,「拒絕訪問」,「ConnectionString的」讓我覺得事情的授權,但只是想.. –

回答

0

要去把這個評論,但它得到太大:-)

我看到您的連接,創建方法都是​​抽象的。這當然意味着衍生物在創建連接時可以做各種不好的事情。我會先看看那裏。

我在類似的情況中發現了一件事......如果您在創建連接的代碼中執行某些操作,該連接使連接字符串爲唯一的,那麼您將不會重用這些池連接。所以...做一些類似於添加"App=MyApp" +增加數字,日期/時間或guid的操作,它會破壞您使用池式連接的能力。當這件事發生在我身上時,我花了我一個時間才弄明白。

如果你的應用在過去是「慢不夠」,這樣的「老」池連接掉出庫的,你可能永遠不會看到一個問題......但後來,有一位客戶變熱新的硬件.. 。和怪!從無處可疑的錯誤!這可能不是你正在發生的事情,但也許它會給你一些關於在哪裏尋找的想法。祝你好運!

+0

好消息是我的連接字符串保持不變。我不修改它。你記得你收到的錯誤嗎?難以理解,如「服務器無法訪問或訪問被拒絕」? –

+0

對不起 - t'was很久以前...但它似乎是這樣的效果。我記得以爲它沒有什麼幫助:-)你怎麼知道*你在使用連接池?您可以在SQL Server Management Studio中觀察連接。 – Clay

+0

我認爲.NET是在封面下做的。我無法輕鬆訪問SSMS。我正在考慮訪問它進行性能分析等。 –