4 回答

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

TA貢獻1853條經驗 獲得超6個贊
通常這可以是服務器設置。如果防火墻 + Windows Defender 處于活動狀態,則它會掃描所有“文件”訪問 - 結果打開速度非常慢,當然還有 close()。
嘗試運行共享文件夾所在的計算機,關閉防火墻和 Windows Defender。我看到這經常解決大的延遲。當然,使用基于套接字的技術可以消除這個問題(例如:基于服務器)。然而,你有你所擁有的,通常不是你的代碼速度,而是“windows 文件”系統,以及網絡和防病毒軟件的速度是導致這種速度下降的原因。

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();
}

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 數據庫!
- 4 回答
- 0 關注
- 318 瀏覽
添加回答
舉報