亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Oledb Connection.Close() 執行時間太長?

為什么 Oledb Connection.Close() 執行時間太長?

C#
撒科打諢 2022-12-31 13:42:03
在開發連接到本地數據庫的桌面應用程序期間,我將數據庫移動到網絡位置,現在每次調用 Connection.Close() 時程序都會掛起 5-15 秒。當數據庫存儲在本地計算機上時,我很少會看到這個問題,但現在它在網絡上,幾乎每次我嘗試 Close() 時它都會掛起。我對數據庫的第一次調用我什至沒有查詢它,它只是一個測試連接,我打開和關閉以確保用戶可以連接,但它仍然掛起太久。我以前見過這個問題,但是除了“嘗試使用(){}讓 c# 清理它之外,沒有人可以提供修復的建議或解決方案?!?這不會以任何方式影響 Close() 時間。連接字符串中是否有解決此問題的選項?有誰知道為什么會這樣?我使用的連接字符串是:CONNECTION_STRING = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\\NEWTORK\Shared\Database\Database.accdb; Persist Security Info=False;"private void  Form_Login_Load(object sender, EventArgs e)  {    OleDbConnection Connection = new OleDbConnection();    Connection.ConnectionString = CONNECTION_STRING;    try    {      Console.Write("Connection Opening.....");      Connection.Open();      Console.WriteLine("Connection Opened");      Console.Write("Writing Status Text.....");      lbl_Status.Text = "Online";      Console.WriteLine("Written Status Text");      Console.Write("Connection Closing.....");      Connection.Close();      Console.WriteLine("Connection Closed");    }    catch (Exception Ex)    {      lbl_Status.Text = "Offline";      lbl_Status.ForeColor = System.Drawing.Color.FromArgb(255, 0, 0);      MessageBox.Show("Could not connect to Database");    }  }在我的輸出窗口中,我立即看到打開消息和寫入狀態消息,但應用程序在“Console.Write(“連接關閉......”)之前掛起;' 線。5-15 秒后,關閉消息出現在窗口中。應用程序中有許多連接查詢數據庫,它似乎在嘗試關閉所有連接之前掛起。我似乎確實注意到,在不關閉應用程序的情況下重復相同的查詢有時會導致重復關閉的關閉時間更快,但它總是在第一次嘗試任何查詢時掛起。
查看完整描述

4 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

最終對我有用的是:當我的 Connection.Close() 方法延遲時間很長時,我使用的是 Microsoft Access 數據庫引擎 2016 (x64)。出于不相關的原因,我需要卸載 2016 引擎并使用 2010 (x86) 版本?,F在我的 Connection.Close() 時間平均約為 40 毫秒,這對我的應用程序來說是完全可以接受的。



查看完整回答
反對 回復 2022-12-31
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

通常這可以是服務器設置。如果防火墻 + Windows Defender 處于活動狀態,則它會掃描所有“文件”訪問 - 結果打開速度非常慢,當然還有 close()。

嘗試運行共享文件夾所在的計算機,關閉防火墻和 Windows Defender。我看到這經常解決大的延遲。當然,使用基于套接字的技術可以消除這個問題(例如:基于服務器)。然而,你有你所擁有的,通常不是你的代碼速度,而是“windows 文件”系統,以及網絡和防病毒軟件的速度是導致這種速度下降的原因。


查看完整回答
反對 回復 2022-12-31
?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

如果數據庫和程序之間有任何掛起的事務,Close()則將它們回滾。它還必須請求連接池并將其從連接池中刪除,這在遠程驅動器上可能需要更長的時間。這可能是你的問題嗎?

這是有關該方法的文檔。

要解決這個問題,您可以使用 BackgroundWorker 來執行它,如下所示:

var b = new BackgroundWorker();

b.DoWork += CloseDB;

b.RunWorkerCompleted += someMethodAfterClose;

b.RunWorkerAsync();

關閉數據庫:


public void CloseDB(object sender, DoWorkEventArgs e) {

    someConnection.Close();

}


查看完整回答
反對 回復 2022-12-31
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

這可能會被標記為“不是答案”,但我也有這個問題,而且似乎沒有人找到真正的解釋,所以與其創建一個多余的問題,不如以下是我的一些癥狀:

  • 當辦公室更新到 Windows 10(從 Windows 7)時開始更頻繁地發生。

  • 經常發生但并非總是如此。有時 OleDb 連接關閉/處理非???,有時它會掛起 ~10-15 秒。對于任何給定的連接嘗試,任何時候的變化似乎都是隨機的,即使使用相同的 Access 數據庫、相同的機器和相同的進程也是如此。

  • 位于本地和網絡上的數據庫都可能發生掛起,但尚未測試一個是否比另一個更頻繁。

  • 即使連接沒有進行任何更改或事務(即只是 SELECT 查詢)也會發生。

  • 只發生在 OleDb 連接上,即用戶通過 Access 接口打開和關閉數據庫是可以的。

更新

無奈之下,我嘗試了在后臺線程中關閉連接的建議,以避免在此過程中阻塞主線程。但是當我這樣做時,每當以后啟動后續連接時,都會出現此錯誤:

未處理的異常:System.AccessViolationException:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞

谷歌搜索表明這似乎發生在很多人處理 Access 數據庫連接時,但通常是出于未知原因。

所以我嘗試了將 conn 字符串更改為 include 的不同建議OLE DB Services=-1;。起初這似乎解決了問題。沒有這方面的專家,據我所知,它基本上通過在后臺打開一些連接資源以供重用來避免掛起關閉問題,即使在處理 conn 對象之后也是如此。對我來說很好......除了最終它似乎關閉了那些資源(可能是一些超時),然后當稍后建立連接時,回到AccessViolationException上面莫名其妙的。

潛在的解決方案

通過拼湊各種網絡評論和我自己的實驗:

  • OleDb 不能很好地處理多線程。

  • 關閉應用程序中最后打開的 Access 連接,無論是什么數據庫,似乎都會觸發 OleDb 庫本身內部某些資源的卸載,因此這是一個潛在的耗時操作。

所以我做了什么,添加一個隱藏在我的應用程序中的空 Access 數據庫,并在啟動時打開一個 OleDb 連接到它。我不處理連接并維護對連接的引用以防止它自行關閉。這樣,任何后續連接的處理都不會觸發 OleDb 保留的任何資源的卸載。

這是一個 hack,但到目前為止,這似乎解決了原始問題。

當然,真正的答案是避免使用 Access 數據庫!


查看完整回答
反對 回復 2022-12-31
  • 4 回答
  • 0 關注
  • 318 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號