Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Имеется ДЛЛ С++ взаимодействующая с приложением через C-API. Пусть в ДЛЛ три экспорт функции и класс cDB, отвечающий за все взаимодействие с БД Sqlite.
1. Приложение вызывает 1-ю функцию ДЛЛ - создается объект класса cDB и через функции cDB что-то пишется в БД.
2. Приложение вызывает время от времени 2-ю функцию ДЛЛ и через cDB пишет данные в БД.
3. приложение вызывает время от времени 3-ю функцию ДЛЛ и через cDB пишет данные в БД. Однако, нет, не пишет. ДЛЛ видит объект cDB, работает с его функциями, однако не видит соединение с БД в cDB, однако, соединение при этом есть и работает. При этом Sqlitе свободна от какого либо взаимодействия с чем либо, для чего функция м.б. заблокирована - что не дает эффекта.
Надо отметить, что функция 2 работает без каких либо проблем (видимо работает в одном потоке с функциями по п.1.
Приложение многопоточное, и в каком потоке какая функция ДЛЛ будет вызываться, и сколько их вообще, потоков в приложении, неизвестно.

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

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
24 июл 19, 21:14    [21933883]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Ошибся, следует читать.
При этом Sqlitе свободна от какого либо взаимодействия с чем либо, для чего функция по п.2 м.б. заблокирована - что не дает эффекта.
24 июл 19, 21:17    [21933885]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Barlone
Member

Откуда:
Сообщений: 1346
При вызове из тестового приложения последовательно из одного потока все функции работают?
Что с одновременным обращением из разных потоков? https://sqlite.org/threadsafe.html
24 июл 19, 21:28    [21933890]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA
Пока видится решение в создании соединения с БД для каждого потока приложения, но неизвестно сколько их, потоков.
ну, это известно. Что коннект в дровах не потокозащищеный объект.
Поэтому программист обязан либо при старте потока внутрь дать коннект, либо каждый поток берет коннект из пула коннектов.
Главное чтобы они не дрались между собой, два потока к одному коннекту.
24 июл 19, 21:28    [21933891]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Barlone,
Круто у sqllite..
автор
Serialized . В сериализованном режиме SQLite может безопасно использоваться несколькими потоками без ограничений.
24 июл 19, 21:33    [21933893]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
PetroNotC Sharp, не дерутся. Полностью блокируем вызовы БД потока по п.2. По п.3 соединение с БД не видит, хотя по структурам и вспомогательным классам созданным new в классе cDB все отрабатывается.
24 июл 19, 21:38    [21933896]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Barlone, из 1-го потока работают, из 2-го нет. Хотя БД сконфигурирована под фулмьютех, пока вопрос одновременности не ставился, пока все по очереди.
24 июл 19, 21:41    [21933898]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA,
Логируйте с выводом в лог id потока. Хорошим логировщиком.
24 июл 19, 21:54    [21933901]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48594

YUBA
"Есть многое на свете, друг Горацио, что и не сразу в голову придет."

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

"Видит" - "не видит" это бесполезный эмоциональный бред.

Posted via ActualForum NNTP Server 1.5

24 июл 19, 21:57    [21933902]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
PetroNotC Sharp, И что даст логгирование? Решение? Ошибиться в программе там просто уже негде. Все выкинуто, функции п.2 и п.3 сделаны абсолютно примитивными и идентичными.
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, что здесь отлаживать? Никаких внешних данных.
24 июл 19, 22:27    [21933913]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Dimitry Sibiryakov
Видит" - "не видит" это бесполезный эмоциональный бред.
+1
Аффтар.Приведите свои мысли в порядок и сформулируйте вопрос топика. Коротко!
24 июл 19, 22:46    [21933928]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA
Все выкинуто
еще выкидывайте. char SQL ЗАЧЕМ?
24 июл 19, 22:50    [21933931]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
PetroNotC Sharp
YUBA
Все выкинуто
еще выкидывайте. char SQL ЗАЧЕМ?
Это уже не смешно.
24 июл 19, 22:51    [21933932]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA
PetroNotC Sharp
пропущено...
еще выкидывайте. char SQL ЗАЧЕМ?
Это уже не смешно.
разумеется.
Стек ошибки где?
Что значит "не видит"?
Так домохозяйки говорят.
24 июл 19, 22:54    [21933936]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
PetroNotC Sharp, не поможет вам стек. Понял, только, что вы любитель демагогии. До свидания.
24 июл 19, 23:03    [21933941]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA,
Добро пожаловать в форум!
Хорошо что я вас привел в чувство).
Работайте!
24 июл 19, 23:09    [21933945]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9468
PetroNotC Sharp
Круто у sqllite..
автор
Serialized
Что крутого в организации очереди для строго последовательного исполнения запросов???
25 июл 19, 04:44    [21933985]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Barlone
Member

Откуда:
Сообщений: 1346
YUBA
PetroNotC Sharp, И что даст логгирование? Решение? Ошибиться в программе там просто уже негде. Все выкинуто, функции п.2 и п.3 сделаны абсолютно примитивными и идентичными.
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 и посмотрите, что там происходит.
25 июл 19, 06:27    [21933991]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Basil A. Sidorov,
Если так то это банально конечно.
Вот смотри.
Беру постгри базу и обязан делать коннект на поток. Так как не Thread-safe.
А тут заявлено что пофигу.
Круче?
25 июл 19, 07:09    [21933999]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Dima T
Member

Откуда:
Сообщений: 14076
Посмотри что возвращает sqlite3_threadsafe()
25 июл 19, 08:09    [21934011]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Basil A. Sidorov,
Фигня этот режим многопоточности в данной конкретной бд.
Это не поможет если в клиентском коде бардак.
http://www.prog.org.ru/topic_30824_45.html
Имхо
25 июл 19, 08:29    [21934013]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Ну а бардак в прикладном коде потому что
YUBA
но неизвестно сколько их, потоков. Не исключено также, что одна и та-же функция в в ДЛЛ может вызываться разными событиями и потоками в приложении.

Надо четко знать, что у нас thread safe и что нет.
Как MS в шарпе ввел даже слово async чтобы помечать))
25 июл 19, 08:33    [21934016]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Dima T
Посмотри что возвращает sqlite3_threadsafe()
Сразу и смотрел =1. С этой стороны проблем не должно быть.
25 июл 19, 12:11    [21934223]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
YUBA
Dima T
Посмотри что возвращает sqlite3_threadsafe()
Сразу и смотрел =1. С этой стороны проблем не должно быть.
ваши проблемы мы "не видим", так же как вы и пишите в заголове сообщения.
Увы.
25 июл 19, 12:39    [21934245]     Ответить | Цитировать Сообщить модератору
 Re: Sqlite в многопоточной программе.  [new]
Dima T
Member

Откуда:
Сообщений: 14076
YUBA
Dima T
Посмотри что возвращает sqlite3_threadsafe()
Сразу и смотрел =1. С этой стороны проблем не должно быть.

Если правильно понимаю, то
https://sqlite.org/compile.html#threadsafe
SQLITE_THREADSAFE=1 sets the default threading mode to Serialized.

Получается все должно работать.

Возможно проблема совсем в другом, например обращение к БД происходит до открытия БД. Ошибка какая в err ?
25 июл 19, 13:11    [21934290]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить