LiteDB 5 System.IO.IOException: процесс не может получить доступ к файлу - PullRequest
1 голос
/ 27 апреля 2020

В настоящее время у нас есть клиентское приложение, которое состоит из службы Windows и приложения WPF, использующих LiteDB и таргетинг. Net Framework 4.8.

Служба windows работает в локальной системе учетная запись и приложение WPF запускается под учетной записью пользователя.

Мы сделали выбор в пользу обновления с 4.1.4 до 5.0.7 в надежде, что параллелизм лучше поддерживается.

И приложение WPF, и Сервис win получает доступ к той же 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 также выполняет чтение и запись в базу данных, но в более короткие промежутки времени c, основанные на взаимодействии с пользователем.

Несмотря на то, что оба приложения обращаются к базе данных одним и тем же способом, и оба указывают на соединение = 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, мы начнем получать исключения.

Кто-нибудь знает, как мы можем остановить это?

1 Ответ

0 голосов
/ 29 апреля 2020

Это была ошибка с самой LiteDB, и с тех пор она была исправлена.

Проблема с github может быть найдена здесь: https://github.com/mbdavid/LiteDB/issues/1656

...