Трудно запустить параллельные вставки на SQLite базу данных в C # -- c# поле с участием sqlite поле с участием system.data.sqlite пол Связанный проблема

Difficulty running concurrent INSERTS on SQLite database in C#


4
vote

проблема

русский

Я запускаю ряд потоков, которые каждая попытка выполнить вставки в одну базу данных SQLite. Каждый поток создает собственную связь с БД. Каждый из них создает команду, открыть транзакцию выполнить некоторые вставки, а затем закрыть транзакцию. Похоже, что вторая нить, чтобы попытаться что-либо получает следующее sqliteexception: файл базы данных заблокирован. Я попытался развернуть вставки из транзакции, а также сужение сферы вкладышей, содержащихся в каждом коммитере без реального эффекта; Последующий доступ к файлу БД поднимает то же исключение.

Любые мысли? Я тупел, и я не уверен, где смотреть следующим ...

Английский оригинал

I'm running a number of threads which each attempt to perform INSERTS to one SQLite database. Each thread creates it's own connection to the DB. They each create a command, open a Transaction perform some INSERTS and then close the transaction. It seems that the second thread to attempt anything gets the following SQLiteException: The database file is locked. I have tried unwrapping the INSERTS from the transaction as well as narrowing the scope of INSERTS contained within each commit with no real effect; subsequent access to the db file raises the same exception.

Any thoughts? I'm stumped and I'm not sure where to look next...

</div
        

Список ответов

5
 
vote
vote
Лучший ответ
 

Обновите свой код вставки, чтобы он столкнулся с исключением, указав блокировку базы данных, он немного ждет и снова пытается. Увеличьте время ожидания случайным приращение каждый раз (алгоритм «случайного отката»). Это должно позволить потокам каждому захватить глобальный замок записи. Производительность будет плохой, но код должен работать без значительного модификации.

Однако SQLite не подходит для высокоодномяктной модификации. У вас есть два постоянных решения:

    .
  • Переместить в «реальную» базу данных, например postgreSQL или mysql
  • сериализуйте все модификации базы данных через один поток, чтобы избежать модификаций SQLite.
 

Update your insertion code so that if it encounters an exception indicating database lock, it waits a bit and tries again. Increase the wait time by random increments each time (the "random backoff" algorithm). This should allow the threads to each grab the global write lock. Performance will be poor, but the code should work without significant modification.

However, SQLite is not appropriate for highly-concurrent modification. You have two permanent solutions:

  • Move to a "real" database, such as PostgreSQL or MySQL
  • Serialize all your database modifications through one thread, to avoid SQLite's modifications.
</div
 
 
       
       
1
 
vote

Две вещи, чтобы проверить:

<Р> 1) Подтверждено, что ваша версия SQLite была собрана с поддержкой НИТИ <Р> 2) Убедитесь, что вы не открытие эксклюзивной базы данных
 

Two things to check:

1) Confirmed that your version of SQLite was compiled with THREAD support

2) Confirm that you are not opening the database EXCLUSIVE

</div
 
 
0
 
vote
<Р> Я не делаю это в C #, а в Android, но я получил вокруг этого «база данных заблокирована» ошибка при сохранении SQLite базы данных всегда открыт в классе обертки, которому принадлежит это, в течение всего срока службы класса-оболочки , Каждая вставка делается в рамках этого класса, то может быть в своем собственном потоке (потому что, в зависимости от ситуации хранения данных, сд карты против памяти устройства и т.д., дб письмо может занять много времени), и я даже пытался задушить его, делая около вставка десятков нитей одновременно, и каждый из них был обработан очень хорошо, потому что метод вставки не должны беспокоиться об открытии / закрытии БД. <Р> Я не уверен, если настойчивый DB жизненных циклов считается хорошим стилем, хотя (это можно считать плохим в большинстве случаев), но сейчас он работает довольно хорошо.
 

I was not doing this in C#, but rather in Android, but I got around this "database is locked" error by keeping the sqlite database always opened within the wrapper class that owns it, for the entire lifetime of the wrapper class. Each insert done within this class then can be in its own thread (because, depending on your data storage situation, sd card versus device memory etc., db writing could take a long time), and I even tried throttling it, making about a dozen insert threads at once, and each one was handled very well because the insert method didn't have to worry about opening/closing a DB.

I'm not sure if persistent DB life-cycles is considered good style, though (it may be considered bad in most cases), but for now it's working pretty well.

</div
 
 

Связанный проблема

1  Узор сопоставления Regex внутри шаблона упаковки  ( Regex match pattern inside a wrapping pattern ) 
Я хочу сопоставить все номера телефонов, которые обернуты между & lt; и & gt; & gt; Теги. Это регулярное выражение для телефонов: <код> 0[2349]{1}-[1-9]{1}...

0  Событие ListBox после сканирования штрих-кода  ( Listbox event after barcode scanning ) 
Я использую ListBox в окне приложение, мой список имеет некоторое количество штрих-кодов. Я хочу отсканировать их с помощью Reader barcode, а затем хочу пер...

-1  Право оправдании десятичного массива в C #?  ( Right justifying decimal array in c ) 
У меня есть проект для моего класса программирования C #; Написание программы, которая может прочитать файл работника и файл продаж и обрабатывать два. Я зако...

1  Есть ли способ генерировать GUID из списка руководств?  ( Is there a way to generate a guid from a list of guids ) 
У меня есть список объектов, которые они имеют GUID для IDS. Я хочу использовать идентификаторы в этом списке объектов для создания GUID, который я могу испол...

0  NU1701, NU1202 Восстановление пакета Восстановление на свежей установке Windows / VS  ( Nu1701 nu1202 package restore errors on fresh windows vs setup ) 
Работа в команде, у нас есть решение в Git, который разрабатывается на 3 разных DEV. Я временно ушел на разное место с моим ноутбуком, где у меня свежая Win 1...

0  C # Обработка исключений на класс  ( C sharp class wide exception handling ) 
Можно ли удалить исключения в одном месте в файле класса C #? Я кодирую некоторые модульные тесты в NUNIT для проверки веб-службы WCF, и на всех методах / т...

3  Представление строки в C #  ( String representation in c sharp ) 
IM TRING, чтобы взять на себя текст из существующей веб-страницы, используя этот метод: <код> try { WebClient client = new WebClient(...

1  Mongodb C # LINQ сгерированный запрос  ( Mongodb c sharp linq generated query ) 
Как я могу получить сгенерированный запрос из запроса LINQ? Я попробовал это, но это не работало: <код> var query = ( from d in mcollection.AsQu...

5  Лучшие практики для сканирования всех классов и методов для пользовательского атрибута  ( Best practices to scan all classes and methods for custom attribute ) 
Впервые я действительно должен был сделать сканирование сборки вручную. Я столкнулся с C # - Как перечислять все классы с атрибутом пользовательского класса?...

0  Запустить функцию JavaScript с использованием C #  ( Trigger javascript function using c sharp ) 
Я должен написать класс C #, который получает содержимое HTML-страницы (страница публичная) и запускает функцию JavaScript, которая загружает файл. Моя цель...

2  Высевание многих для многих кода EF первые отношения  ( Seeding many to many ef code first relationship ) 
Есть несколько других сообщений по этой теме, которую я видел, но я не смог получить правильный ответ еще (моя собственная вина, я уверен), но я хочу сеять ба...

5  Сделать структуру сущности быть нечувствительными к регистру  ( Make entity framework be case insensitive ) 
Возможно ли установить корпус строки структуры объекта нечувствителен по умолчанию? Если я использую <код> string.StartsWith("stringToCompare", StringComp...

0  Очистите DataTable в петле Перемещение используемых элементов к двум другим источникам данных [дубликат]  ( Clean a datatable in a loop moving used items to two other datatables ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже имеет ответ здесь : ...

0  Wpf keypreview windows ключ и второй ключ  ( Wpf keypreview windows key and second key ) 
Я реализую приложение WPF в C # 4.5 для Windows 7, и я хотел бы иметь возможность схватить событие, когда пользователь нажимает клавишу Windows и C. Я реали...

1  Включить первый случай исключений для определенного куска кода  ( Enable first chance exceptions for specific piece of code ) 
Мне нужна Visual Studio, чтобы бросить первые шансы исключения только для определенного класса. Если я включаю первый случай исключения в Visual Studio, он ...

Связанный проблема

1  Узор сопоставления Regex внутри шаблона упаковки 
0  Событие ListBox после сканирования штрих-кода 
-1  Право оправдании десятичного массива в C #? 
1  Есть ли способ генерировать GUID из списка руководств? 
0  NU1701, NU1202 Восстановление пакета Восстановление на свежей установке Windows / VS 
0  C # Обработка исключений на класс 
3  Представление строки в C # 
1  Mongodb C # LINQ сгерированный запрос 
5  Лучшие практики для сканирования всех классов и методов для пользовательского атрибута 
0  Запустить функцию JavaScript с использованием C # 
2  Высевание многих для многих кода EF первые отношения 
5  Сделать структуру сущности быть нечувствительными к регистру 
0  Очистите DataTable в петле Перемещение используемых элементов к двум другим источникам данных [дубликат] 
0  Wpf keypreview windows ключ и второй ключ 
1  Включить первый случай исключений для определенного куска кода 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.