我有一個API,它打開一個訪問數據庫進行讀取和寫入。 API在構建時打開連接,並在連接被破壞時關閉連接。當數據庫打開時,將創建一個.ldb
文件,並在其關閉時將其刪除(或消失)。訪問.ldb文件和多個連接。
有多個應用程序使用API讀取和寫入訪問數據庫。我想知道:
- 用於跟蹤多個連接
ldb
文件是否調用一個db.close()
關閉所有連接,或者只是一個實例。- 上述方法是否會有任何同步問題。
我有一個API,它打開一個訪問數據庫進行讀取和寫入。 API在構建時打開連接,並在連接被破壞時關閉連接。當數據庫打開時,將創建一個.ldb
文件,並在其關閉時將其刪除(或消失)。訪問.ldb文件和多個連接。
有多個應用程序使用API讀取和寫入訪問數據庫。我想知道:
ldb
文件是否調用一個db.close()
關閉所有連接,或者只是一個實例。db.Close()關閉一個連接。所有連接關閉後,.ldb會自動刪除。請記住,儘管Jet數據庫(即Access)支持多個同時在線的用戶,但它們並不適合非常大的併發用戶羣;一方面,當網絡問題時,它們很容易被破壞。我現在正在處理這個問題。如果涉及到這一點,您將需要使用數據庫服務器。
也就是說,我已經多次使用過Jet數據庫。
不確定當你說「同步問題」時你的意思。
Close()
只關閉一個連接,其他連接不受影響。其實MS Access是不是多連接的使用場景最佳的解決方案。 您可以查看SQL Server Compact這是MS SQL Server的簡易版本。它運行在進程中,支持多連接和多線程,大多數強大的T-SQL功能(不包括存儲過程)等。
作爲另外的好的答案,我強烈建議保持與虛擬表的連接在客戶端應用程序的生命週期中打開。
過於頻繁地關閉連接並允許每次創建/刪除鎖定文件都是一個巨大的性能瓶頸,並且在某些情況下快速訪問數據庫實際上會導致查詢和插入失敗。
你可以閱讀更多的this answer我給前一陣子了一下。
當涉及到性能和可靠性,可以得到相當多了Access數據庫提供你把一些東西記:
保持連接打開,爲持續時間的虛表客戶端的生命週期(或者至少使用一些超時時間,如果你不想一直保持打開狀態,就會在不活動20秒後關閉連接)。
設計您的客戶端應用程序以正確關閉所有連接(包括虛擬連接),無論發生什麼情況(例如崩潰,用戶關閉等)。
鎖定就緒並不好,因爲這可能意味着客戶端已將數據庫置於未知狀態,並且如果其他客戶端繼續丟棄舊鎖,則可能會增加發生損壞的可能性。
壓縮並定期修復數據庫。讓它成爲夜間任務。
這將確保數據庫已經過優化,並且任何過時的數據都會被刪除,並且打開的鎖定會正確關閉。
良好穩定的網絡連接對於基於文件的數據庫的數據完整性至關重要:避免像瘟疫一樣的WiFi。
有辦法從數據庫服務器本身踢出所有客戶端。
例如,有一個表格,例如客戶定期進行輪詢的MaintenanceLock
字段。如果該字段已設置,客戶應在給予用戶保存工作機會後斷開連接。
同樣,當客戶端應用程序啓動時,請檢查數據庫中的此字段以允許或禁止客戶端連接到它。
現在,您可以隨時快速找到客戶,而無需轉到每個用戶並要求他們關閉應用程序。當您運行Compact &維修維護時,確保沒有晚上打開的客戶端仍然連接到數據庫也非常有用。
有時,我發現刪除所有連接到Access數據庫的唯一方法是重新啓動計算機。那就是他們。 – HelloW
是的,如果你不是非常小心地釋放它們,它很容易保持訪問連接。使用C#interop尤其如此,您必須確保您使用Marshal.FinalReleaseComObject並進行顯式垃圾回收。 – transistor1