簡體   English   中英

.NET SQL Server連接問題 - 可能與連接池有關

[英].NET SQL Server connection issue - Maybe connection pool related

我有一個非常奇怪的問題,我希望有人有類似的經歷。

在我們的應用程序開始時,我的公司應用程序的一個客戶端被“禁止”從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通信時失敗。

我懷疑是連接池中發生了什么。 這導致失敗,進而導致拒絕訪問。

其他有趣的觀點。 所有工作都運行了大約一年,客戶幾個月前買了一台新機器,一切正常,然后突然停止。 我把應用程序放在客戶端站點的另一台機器上,並且運行良好一周,然后出現了同樣的問題。 我們在客戶端的機器上關閉了一切,但問題仍然存在。 我以為防火牆但沒有運氣。

非常感謝任何幫助。

會把它放在評論中,但它太大了:-)

我看到你的連接創建方法是抽象的。 這當然意味着衍生品在創建連接時可以做各種不好的事情。 我先看看那里。

我在類似的情況下發現了一件事......如果你在創建連接的代碼中做了一些使連接字符串唯一的東西 ,你就不會重用那些池連接。 所以...做一些事情,比如添加一個"App=MyApp" +一個遞增的數字,日期/時間或guid,它將破壞你使用池連接的能力。 當這件事發生在我身上時,我花了很長時間才弄明白。

如果您的應用程序過去“足夠慢”,那么“舊的”池化連接會從池中掉出來,您可能永遠不會看到問題......但是,然后,說客戶獲得熱門的新硬件......而且責備。 ..無處不在的錯誤! 這可能不是你發生的事情,但它可能會給你一些關於在哪里看的想法。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM