LiteDB 5 System.IO.IOException:进程无法访问该文件



我们目前有一个客户端应用程序,它由Windows服务和WPF应用程序组成,两者都使用LiteDB并以.Net Framework 4.8为目标。

windows服务在本地系统帐户下运行,WPF应用程序在用户帐户下运行。

我们选择从4.1.4升级到5.0.7,希望能更好地支持并发。

WPF应用程序和win服务都访问相同的LiteDB(读写(,连接=使用以下连接字符串共享:

"Filename=C:tempTest-v5.db;password=pass1234;connection=shared"

using (var db = new LiteDatabase(@"Filename=C:tempTest-v5.db;password=pass1234;connection=shared"))
{
...
}

然而,我们似乎遇到了一个突发问题,似乎找不到其他人有同样/类似的问题或任何其他可以解决的问题。

该服务经常轮询数据库,以处理和处理WPF应用程序通过读取和写入操作插入的数据。WPF应用程序还可以读取和写入数据库,但基于用户交互的时间框架更为零散。

尽管两个应用程序都以相同的方式访问数据库,并且都指定connection=shared,但由于它们似乎发生了冲突,我们还是从两者中得到了异常。

"System.IO.IOException: The process cannot access the file 'C:tempTest-v5.db' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at LiteDB.Engine.FileStreamFactory.GetStream(Boolean canWrite, Boolean sequencial)
at LiteDB.Engine.StreamPool.<>c__DisplayClass3_0.<.ctor>b__0()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at LiteDB.Engine.DiskService..ctor(EngineSettings settings, Int32[] memorySegmentSizes)
at LiteDB.Engine.LiteEngine..ctor(EngineSettings settings)
at LiteDB.SharedEngine.OpenDatabase()
at LiteDB.SharedEngine.Query(String collection, Query query)
at LiteDB.LiteQueryable`1.<ToDocuments>d__26.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Pixel_Upload_Service.UploadService.GetPendingJobsFromLiteDB(Boolean _allJobs) in D:UsersDanielDesktopLiteDB v5 TestUpload ServiceUploadService.cs:line 2654"

顺便说一句,在测试这个问题并试图弄清楚发生了什么时,我们发现两个WPF应用程序从同一数据库读取和写入时没有出现任何异常,但是,一旦我们将一个WPF程序换成Windows服务,我们就会开始出现异常。

有人知道我们如何才能阻止这种情况的发生吗?

我们在使用LiteDb V.5.0.8 时遇到了同样的问题

我们将数据库文件存储在一个外部文件共享中,多个客户端正试图访问该文件

基本上与上面提到的代码相同,但在外部驱动器上,而不是在内部驱动器上。

当我们在内部驱动器上使用db路径运行相同的代码时,它可以正常工作,但在外部(Unix(驱动器上,我们会得到所描述的错误。

这与最初问题中描述的起始位置没有直接关系,但我想分享我的经验,因为我间歇性地受到同一错误消息的影响:

";进程无法访问文件"…"因为它正被另一个进程使用">

LiteDb 5.0.9在从LiteDb 4.1.4更新后在IIS上的ASP.NET MVC中运行。

在我删除upgrade=true之后,它就消失了。也许这些信息来自于他人的帮助。

这是LiteDB本身的一个错误,现已修复。

github上的问题可以在这里找到:https://github.com/mbdavid/LiteDB/issues/1656

最新更新