2012-11-30 49 views
1

我有一個用戶在使用我的應用程序時報告此錯誤。無法打開共享內存區域錯誤

該應用程序是在Windows XP Embedded上運行的.NET Winforms應用程序,使用SQL Server CE 3.5 sp1,Linq-To-SQL作爲ORM。數據庫本身位於我的應用程序在My Documents文件夾中創建的子目錄中。用戶帳戶是系統上的管理員帳戶。沒有其他應用程序或進程連接到數據庫。

大部分情況下,應用程序似乎運行良好。它啓動後,可以從數據庫中加載數據並將數據保存到數據庫中。用戶每天使用應用程序訪問數據庫可能會多達幾百次。他們得到這個錯誤,但只是間歇性的。也許每天3-4次。

在代碼本身中,對數據庫的所有調用都使用包裝在using子句中的Linq-To-SQL數據上下文。所以,換句話說:

using(MyDataContext db = new MyDataContext(ConnectionString)) 
{ 
    List<blah> someList = db.SomeTable.Where(//selection criteria).ToList(); 

    return(someList); 
} 

這就是幾乎所有的調用數據庫的樣子(所不同的是明顯保存數據的那些沒有選擇和返回任何東西)。正如我之前提到的,他們在99%的時間內沒有問題,但每天只能獲得幾次共享內存錯誤。

我當前的「修復」是在應用程序啓動時我簡單地從數據庫中讀取所有數據(並不是很多)並將其緩存在內存中,並將數據庫調用轉換爲從內存列表中讀取。到目前爲止,這似乎解決了這個問題。現在他們已經報告了一天半沒有問題。但是這仍然困擾着我,因爲我不知道最初會導致錯誤的原因。

雖然應用程序每天訪問數據庫幾百次,但它通常不是快速連續的。通常每隔幾分鐘至少一次。但是,有一種情況下可能會有兩個請求,一個接一個地接一個,儘可能快。換句話說,這樣的:

//user makes a selectio n on the screen 
DatabaseCall1(); 
DatabaseCall2(); 

這兩項會遵循上面,他們創建新的上下文中的代碼塊的模式,做的工作,然後返回。但是這些調用不是異步的,所以我希望在調用DatabaseCall2之前關閉連接並處理它。但是,SQL Server CE端的某些東西是否會不夠快地關閉連接?這也許可以解釋爲什麼它可能是間歇性的,因爲也許大多數時候它沒有問題?我還應該提及,沒有修復的這個確切的程序安裝在幾個其他系統上,它們具有完全相同的硬件和軟件(它們是相互克隆的),而其他系統的用戶沒有報告任何錯誤。

因爲我無法在我的開發機器或測試機器上重現此錯誤,所以我被困在腦後,並且在這裏和其他地方通常圍繞不充分的用戶權限或數據庫上的數據庫共享網絡文件夾。

+0

是否有問題的用戶已打開的數據庫文件我另一應用程序/軟件(有不同的連接字符串)?或者你的應用程序使用幾個不同的(逐字母)連接字符串? – ErikEJ

回答

相關問題