Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504

Как в SQLite включить многопоточный режим?

02.11.2016, 11:57. Показов 5337. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
на официальном сайте пишут что существуют три режима работы бд http://www.sqlite.org/threadsafe.html
на просторах хабра нашлась статья, в которой рассказывается как менять эти режимы, но применима она для С++
а как же разрешить работать базе с C# в много поточном режиме?
вот мой код коннекта
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public void connection()
    {
        try
        {
            if (Application.platform == RuntimePlatform.WindowsEditor)
            { 
                path = Application.dataPath + "/vikt.bytes";
            }
 
            if (Application.platform == RuntimePlatform.WindowsPlayer)
            {
                path = Application.dataPath + "/vikt.bytes";
            }
 
            if (Application.platform == RuntimePlatform.Android) 
            {
            //#if UNITY_ANDROID && !UNITY_EDITOR
                path = Application.persistentDataPath + "/vikt.bytes";
                if (!File.Exists(path))
                {
                    WWW load = new WWW("jar:file://" + Application.dataPath + "!/Assets/" + "vikt.bytes");
                    while(!load.isDone){}
                    File.WriteAllBytes(path, load.bytes);
                }
            //#endif
            }
 
            con_db = new SqliteConnection("URI=file:" + path);
            
            con_db.Open();
 
        }
        catch (Exception ex)
        {
            Debug.Log("ошибка"+ex.ToString());
        }
    }
PS: по сути проблемма в следующем, в один "прекрасный день" Unity, на котором я пишу приложение для телефона перестало адекватно работать с базой данных, а именно перестали обрабатываться запросы на изменение и в консоль пишет такую ошибку
ошибкаMono.Data.Sqlite.SqliteException: The database file is locked
database is locked

пробовал перед запросами отключаться и заново подключаться, проблема не пропала
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2016, 11:57
Ответы с готовыми решениями:

Как включить поддержку ICU в System.Data.SQLite ?
Это повтор моей темы из рассылки sqlite http://sqlite.1065341.n5.nabble.com/ Как включить поддержку ICU в System.Data.SQLite ? Мне...

Файл cookies.sqlite не sqlite на самом деле, или как его открыть
хочу прочитать куки браузеров (это не противозаконно) оперу сделал, хром сделал, у хрома как раз sqlite как и у мозилы делаю...

Как включить графический режим
Здравствуйте. У меня х64 поэтому я использую паскаль на DosBox(SCHOOL PAK). Прочитал, что в SP не надо указывать путь к графическим...

6
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.11.2016, 15:28
kelod, из недавних опытов и чтения доков я сделал вывод, что по умолчанию каждый Insert в БД типа SQLite заворачивается в транзакцию. Это, в частности, приводит к очень долгой вставке более-менее большого набора данных. В их обертке для C# я не нашел, как это отключить. По всей видимости, именно это у вас и происходит - идет обращение из разных потоков к файлу БД, а поскольку какой-то запрос (тот что пришел ранее) находится в транзакции, вы получаете такую вот ошибку.
Для своей проблемы я нашел выход (использовать транзакции вручную). Вам тоже может помочь такой выход, единственный момент, его придется приспособить под многопоточное применение.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
02.11.2016, 15:48  [ТС]
теория становится более менее понятной, а как это применить на практике?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.11.2016, 16:03
Цитата Сообщение от kelod Посмотреть сообщение
как это применить на практике?
Если примерно прикинуть, то надо, наверное, определить одну переменную (статическую) для объекта соединения и одну для транзакции (тоже статическую). В статическом конструкторе их инициализировать, и во всех методах объект команды подключать к транзакции. Примерно так, дальше надо экспериментировать.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
02.11.2016, 16:33  [ТС]
а как пользоваться этими переменными? как сказать базе о транзакции?
если можно хоть небольшой кусочек кода или страничку, где про это можно почитать, только на русском желательно
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.11.2016, 20:04
Цитата Сообщение от kelod Посмотреть сообщение
хоть небольшой кусочек кода
Попробуйте примерно по такому шаблону определить класс для работы с БД и поработать через него из нескольких потоков.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SQLite;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            using (SQLiteHelper helper = new SQLiteHelper()) {
                //Используем наш класс...
            }
        }
    }
    public class SQLiteHelper : IDisposable {
        static SQLiteConnection sqliteConnection = null;
        static SQLiteTransaction sqliteTransaction = null;
 
        static SQLiteHelper() {
            string CONNECT_STR = "";
            sqliteConnection = new SQLiteConnection(CONNECT_STR);
            sqliteConnection.Open();
            sqliteTransaction = sqliteConnection.BeginTransaction();
        }
 
        public void Foo() {
            string selectCmd = "SELECT * FROM Table_Name";
            using (SQLiteCommand cmd = new SQLiteCommand(selectCmd, sqliteConnection)) {
                cmd.Transaction = sqliteTransaction;
                //Тут работаем дальше...
            }
        }
        public void Dispose() {
            if (sqliteTransaction != null) {
                sqliteTransaction.Commit();
            }
            if (sqliteConnection != null && sqliteConnection.State == ConnectionState.Open) {
                sqliteConnection.Close();
            }
        }
    }
}
1
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
03.11.2016, 16:41  [ТС]
спасибо, кажется починилось, единственное я конструктор не статическим сделал, пока был статиком невозможно было второй раз подключится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.11.2016, 16:41
Помогаю со студенческими работами здесь

Как включить режим полёта?
Как програмно включить режим полёта?

Как включить режим Turbo Boost
розкажите в подробностях как включить Turbo Boost AMD A6 3400M (1.4 GHz, 4ядра)

HP 15-ba102ur как включить режим Turbo
HP 15-ba102ur как включить режим Turbo ? Чтобы с частоты 2900 перейти на 3500 ? Заранее спасибо за ответы)

Как включить спящий режим в IAR-e?
Всем привет. Подскажите кто знает, как перевести атмегу48 в режим power down? Программу пишу в IARe. Пробовал так: ...

Как включить полноэкранный режим во флэше?
Сорри если не туда, уже замучался искать. Значит так, http://randomflash.ru/ сайтик. Там стоит рандомизатор флэш игрушек, вот только они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru