C Многопоточность - доступ к базе данных Sqlite3 из-за двух потоков

Вот описание моей проблемы:

У меня есть 2 темы в моей программе. Один - это основной поток, а другой - который я создаю, используя pthread_create.

Основной поток выполняет различные функции в базе данных sqlite3. Каждая функция открывается для выполнения необходимых действий и закрывает ее по завершении.

Другой поток просто читает из базы данных через заданный интервал времени и загружает его на сервер. Поток также открывает и закрывает базу данных для выполнения своей операции.

Проблема возникает, когда оба потока открывают базу данных. Если один завершает работу первым, он закрывает базу данных, вызывая сбой другого, что делает приложение непригодным для использования. Главное требует базы данных для каждой операции.

Есть ли способ, которым я могу предотвратить это? Mutex - это один из способов, но если я использую mutex, это сделает мой основной поток бесполезным. Основной поток должен всегда оставаться работоспособным, а другой поток работает в фоновом режиме.

Любой совет, чтобы сделать эту работу было бы здорово. Я не предоставил фрагменты, так как эта проблема слишком обширна для этого, но если вы ничего не понимаете, пожалуйста, дайте мне знать.

РЕДАКТИРОВАТЬ:

static sqlite3 *db = NULL;

Фрагмент кода для открытия базы данных

int open_database(char* DB_dir) // argument is the db path
        rc = sqlite3_open(DB_dir , &db); 

        if( rc )                
        {
//failed to open message
            sqlite3_close(db); 
            db = NULL;
            return SDK_SQL_ERR;
        }
        else
        {
            //success message
        }
    }
    return SDK_OK;

}

И закрыть дб

int close_database()
{
    if(db!=NULL)
    {
        sqlite3_close(db);
        db = NULL;
        //success message
    }
    return 1;
}

РЕДАКТИРОВАТЬ: я забыл добавить, что фоновый поток выполняет одну операцию записи, которая обновляет 1 поле таблицы для каждой строки, которую он загружает на сервер

2 ответа

Пусть ваши потоки используют свое соединение с базой данных. Нет никакой причины для фонового потока влиять на соединение основного потока.

Как правило, я хотел бы использовать пул соединений, чтобы не очень часто открывать и закрывать соединения с базой данных; Открытие соединения - дорогостоящая операция.

На серверах приложений у нас очень часто много потоков, и мы находим, что пула соединений в несколько десятков соединений достаточно для обслуживания запросов от имени многих сотен пользователей.

В основном встроенный в sqlite3 есть механизмы для обеспечения блокировки... BEGIN EXCLUSIVE тогда вы также можете зарегистрировать обратный вызов сна, чтобы другой поток мог делать другие вещи...

см. sqlite3_busy_handler()

Другие вопросы по тегам