繁体   English   中英

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

[英]LiteDB 5 System.IO.IOException: The process cannot access the file

我们目前有一个客户端应用程序,它包含一个 Windows 服务和一个 WPF 应用程序,两者都使用 LiteDB 和 target.Net Framework 4.8。

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

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

WPF 应用程序和 win 服务都使用以下连接字符串使用 connection=shared 访问相同的 LiteDB(读取和写入):

"Filename=C:\temp\Test-v5.db;password=pass1234;connection=shared"

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

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

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

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

"System.IO.IOException: The process cannot access the file 'C:\temp\Test-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:\Users\Daniel\Desktop\LiteDB v5 Test\Upload Service\UploadService.cs:line 2654"

作为测试此问题并试图弄清楚发生了什么的附带说明,我们发现我们没有遇到任何异常,两个 WPF 应用程序从同一数据库读取和写入,但是一旦我们交换一个 WPF 应用程序一个 Windows 服务,我们开始得到异常。

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

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

我们将数据库文件存储在多个客户端尝试访问它的外部文件共享上。

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

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

它与最初问题中描述的起始 position 没有直接关系,但我想分享我的经验,因为我受到相同错误消息的影响:

“该进程无法访问文件'...',因为它正被另一个进程使用。”

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

在我删除upgrade=true;后它就消失了从连接字符串。 也许这些信息来自对其他人的帮助。

这是 LiteDB 本身的一个错误,并且已被修补。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM