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

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

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

Author24 — интернет-сервис помощи студентам
на официальном сайте пишут что существуют три режима работы бд 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.11.2016, 11:57
Ответы с готовыми решениями:

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

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

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

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

6
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
02.11.2016, 15:28 2
kelod, из недавних опытов и чтения доков я сделал вывод, что по умолчанию каждый Insert в БД типа SQLite заворачивается в транзакцию. Это, в частности, приводит к очень долгой вставке более-менее большого набора данных. В их обертке для C# я не нашел, как это отключить. По всей видимости, именно это у вас и происходит - идет обращение из разных потоков к файлу БД, а поскольку какой-то запрос (тот что пришел ранее) находится в транзакции, вы получаете такую вот ошибку.
Для своей проблемы я нашел выход (использовать транзакции вручную). Вам тоже может помочь такой выход, единственный момент, его придется приспособить под многопоточное применение.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 478
02.11.2016, 15:48  [ТС] 3
теория становится более менее понятной, а как это применить на практике?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
02.11.2016, 16:03 4
Цитата Сообщение от kelod Посмотреть сообщение
как это применить на практике?
Если примерно прикинуть, то надо, наверное, определить одну переменную (статическую) для объекта соединения и одну для транзакции (тоже статическую). В статическом конструкторе их инициализировать, и во всех методах объект команды подключать к транзакции. Примерно так, дальше надо экспериментировать.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 478
02.11.2016, 16:33  [ТС] 5
а как пользоваться этими переменными? как сказать базе о транзакции?
если можно хоть небольшой кусочек кода или страничку, где про это можно почитать, только на русском желательно
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
02.11.2016, 20:04 6
Цитата Сообщение от 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
Сообщений: 478
03.11.2016, 16:41  [ТС] 7
спасибо, кажется починилось, единственное я конструктор не статическим сделал, пока был статиком невозможно было второй раз подключится
0
03.11.2016, 16:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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? Программу пишу в...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru