Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Sqlite в многопоточной программе. / 25 сообщений из 85, страница 1 из 4
24.07.2019, 21:14
    #39841124
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Имеется ДЛЛ С++ взаимодействующая с приложением через C-API. Пусть в ДЛЛ три экспорт функции и класс cDB, отвечающий за все взаимодействие с БД Sqlite.
1. Приложение вызывает 1-ю функцию ДЛЛ - создается объект класса cDB и через функции cDB что-то пишется в БД.
2. Приложение вызывает время от времени 2-ю функцию ДЛЛ и через cDB пишет данные в БД.
3. приложение вызывает время от времени 3-ю функцию ДЛЛ и через cDB пишет данные в БД. Однако, нет, не пишет. ДЛЛ видит объект cDB, работает с его функциями, однако не видит соединение с БД в cDB, однако, соединение при этом есть и работает. При этом Sqlitе свободна от какого либо взаимодействия с чем либо, для чего функция м.б. заблокирована - что не дает эффекта.
Надо отметить, что функция 2 работает без каких либо проблем (видимо работает в одном потоке с функциями по п.1.
Приложение многопоточное, и в каком потоке какая функция ДЛЛ будет вызываться, и сколько их вообще, потоков в приложении, неизвестно.

Пока видится решение в создании соединения с БД для каждого потока приложения, но неизвестно сколько их, потоков. Не исключено также, что одна и та-же функция в в ДЛЛ может вызываться разными событиями и потоками в приложении.
С другой стороны, потоки, вроде бы, должны работать в одном адресном пространстве и видеть переменные, ведь видим объект cDB в п.3.

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
24.07.2019, 21:17
    #39841125
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Ошибся, следует читать.
При этом Sqlitе свободна от какого либо взаимодействия с чем либо, для чего функция по п.2 м.б. заблокирована - что не дает эффекта.
...
Рейтинг: 0 / 0
24.07.2019, 21:28
    #39841127
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
При вызове из тестового приложения последовательно из одного потока все функции работают?
Что с одновременным обращением из разных потоков? https://sqlite.org/threadsafe.html
...
Рейтинг: 0 / 0
24.07.2019, 21:28
    #39841128
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBAПока видится решение в создании соединения с БД для каждого потока приложения, но неизвестно сколько их, потоков.ну, это известно. Что коннект в дровах не потокозащищеный объект.
Поэтому программист обязан либо при старте потока внутрь дать коннект, либо каждый поток берет коннект из пула коннектов.
Главное чтобы они не дрались между собой, два потока к одному коннекту.
...
Рейтинг: 0 / 0
24.07.2019, 21:33
    #39841129
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Barlone,
Круто у sqllite..
авторSerialized . В сериализованном режиме SQLite может безопасно использоваться несколькими потоками без ограничений.
...
Рейтинг: 0 / 0
24.07.2019, 21:38
    #39841130
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
PetroNotC Sharp, не дерутся. Полностью блокируем вызовы БД потока по п.2. По п.3 соединение с БД не видит, хотя по структурам и вспомогательным классам созданным new в классе cDB все отрабатывается.
...
Рейтинг: 0 / 0
24.07.2019, 21:41
    #39841131
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Barlone, из 1-го потока работают, из 2-го нет. Хотя БД сконфигурирована под фулмьютех, пока вопрос одновременности не ставился, пока все по очереди.
...
Рейтинг: 0 / 0
24.07.2019, 21:54
    #39841134
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBA,
Логируйте с выводом в лог id потока. Хорошим логировщиком.
...
Рейтинг: 0 / 0
24.07.2019, 21:57
    #39841135
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBA"Есть многое на свете, друг Горацио, что и не сразу в голову придет."

"Есть муторный процесс на свете этом, который кличут все отладкой."

"Видит" - "не видит" это бесполезный эмоциональный бред.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 22:27
    #39841141
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
PetroNotC Sharp, И что даст логгирование? Решение? Ошибиться в программе там просто уже негде. Все выкинуто, функции п.2 и п.3 сделаны абсолютно примитивными и идентичными.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
sqlite3 *db=0;

int func1() // работает
{
const char* SQL = "CREATE TABLE IF NOT EXISTS tab1(a0 real, a1 real, a2 real, a3);";
sqlite3_exec(db, SQL, 0, 0, &err);
}

int func2() //вызывается из другого потока, не видит соединения с БД.
{
// er= sqlite3_prepare_v2(db, "begin;", 10, &ppStmt, &tail); // остатки старого кода. на этом уже затыкался.
const char* SQL = "CREATE TABLE IF NOT EXISTS tab2(a0 real, a1 real, a2 real, a3);";
sqlite3_exec(db, SQL, 0, 0, &err);
}


Dimitry Sibiryakov, что здесь отлаживать? Никаких внешних данных.
...
Рейтинг: 0 / 0
24.07.2019, 22:46
    #39841147
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Dimitry SibiryakovВидит" - "не видит" это бесполезный эмоциональный бред.+1
Аффтар.Приведите свои мысли в порядок и сформулируйте вопрос топика. Коротко!
...
Рейтинг: 0 / 0
24.07.2019, 22:50
    #39841149
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBAВсе выкинутоеще выкидывайте. char SQL ЗАЧЕМ?
...
Рейтинг: 0 / 0
24.07.2019, 22:51
    #39841150
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
PetroNotC SharpYUBAВсе выкинутоеще выкидывайте. char SQL ЗАЧЕМ? Это уже не смешно.
...
Рейтинг: 0 / 0
24.07.2019, 22:54
    #39841152
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBAPetroNotC Sharpпропущено...
еще выкидывайте. char SQL ЗАЧЕМ? Это уже не смешно.разумеется.
Стек ошибки где?
Что значит "не видит"?
Так домохозяйки говорят.
...
Рейтинг: 0 / 0
24.07.2019, 23:03
    #39841154
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
PetroNotC Sharp, не поможет вам стек. Понял, только, что вы любитель демагогии. До свидания.
...
Рейтинг: 0 / 0
24.07.2019, 23:09
    #39841157
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBA,
Добро пожаловать в форум!
Хорошо что я вас привел в чувство).
Работайте!
...
Рейтинг: 0 / 0
25.07.2019, 04:44
    #39841184
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
PetroNotC SharpКруто у sqllite..авторSerializedЧто крутого в организации очереди для строго последовательного исполнения запросов???
...
Рейтинг: 0 / 0
25.07.2019, 06:27
    #39841188
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBAPetroNotC Sharp, И что даст логгирование? Решение? Ошибиться в программе там просто уже негде. Все выкинуто, функции п.2 и п.3 сделаны абсолютно примитивными и идентичными.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
sqlite3 *db=0;

int func1() // работает
{
const char* SQL = "CREATE TABLE IF NOT EXISTS tab1(a0 real, a1 real, a2 real, a3);";
sqlite3_exec(db, SQL, 0, 0, &err);
}

int func2() //вызывается из другого потока, не видит соединения с БД.
{
// er= sqlite3_prepare_v2(db, "begin;", 10, &ppStmt, &tail); // остатки старого кода. на этом уже затыкался.
const char* SQL = "CREATE TABLE IF NOT EXISTS tab2(a0 real, a1 real, a2 real, a3);";
sqlite3_exec(db, SQL, 0, 0, &err);
}


Dimitry Sibiryakov, что здесь отлаживать? Никаких внешних данных.Так не должно бытью Ну SQLite в исходниках же, зайдите уже внутрь sqlite3_exec и посмотрите, что там происходит.
...
Рейтинг: 0 / 0
25.07.2019, 07:09
    #39841194
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Basil A. Sidorov,
Если так то это банально конечно.
Вот смотри.
Беру постгри базу и обязан делать коннект на поток. Так как не Thread-safe.
А тут заявлено что пофигу.
Круче?
...
Рейтинг: 0 / 0
25.07.2019, 08:09
    #39841198
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Посмотри что возвращает sqlite3_threadsafe()
...
Рейтинг: 0 / 0
25.07.2019, 08:29
    #39841200
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Basil A. Sidorov,
Фигня этот режим многопоточности в данной конкретной бд.
Это не поможет если в клиентском коде бардак.
http://www.prog.org.ru/topic_30824_45.html
Имхо
...
Рейтинг: 0 / 0
25.07.2019, 08:33
    #39841202
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Ну а бардак в прикладном коде потому что
YUBAно неизвестно сколько их, потоков. Не исключено также, что одна и та-же функция в в ДЛЛ может вызываться разными событиями и потоками в приложении.
Надо четко знать, что у нас thread safe и что нет.
Как MS в шарпе ввел даже слово async чтобы помечать))
...
Рейтинг: 0 / 0
25.07.2019, 12:11
    #39841327
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
Dima TПосмотри что возвращает sqlite3_threadsafe() Сразу и смотрел =1. С этой стороны проблем не должно быть.
...
Рейтинг: 0 / 0
25.07.2019, 12:39
    #39841338
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBADima TПосмотри что возвращает sqlite3_threadsafe() Сразу и смотрел =1. С этой стороны проблем не должно быть.ваши проблемы мы "не видим", так же как вы и пишите в заголове сообщения.
Увы.
...
Рейтинг: 0 / 0
25.07.2019, 13:11
    #39841358
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sqlite в многопоточной программе.
YUBADima TПосмотри что возвращает sqlite3_threadsafe() Сразу и смотрел =1. С этой стороны проблем не должно быть.
Если правильно понимаю, то
https://sqlite.org/compile.html#threadsafe SQLITE_THREADSAFE=1 sets the default threading mode to Serialized.
Получается все должно работать.

Возможно проблема совсем в другом, например обращение к БД происходит до открытия БД. Ошибка какая в err ?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Sqlite в многопоточной программе. / 25 сообщений из 85, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]