2015-02-04 4 views
0

Я разрабатываю многопоточное приложение cpp, которое считывает данные из базы данных sqlite. Я столкнулся с проблемой многопоточных попыток чтения, вызывающих «неизвестную ошибку». Я предполагаю, что это должно быть что-то вроде блокировки базы данных.SQLite-запросы, возвращающие «неизвестную ошибку»

Мой вопрос следующий: Почему база данных блокирует операции чтения? Я бы понял, было ли это чтение/запись, но это приложение выполняет только команды select.

Потенциальных решения моей проблемы: Бросьте некоторые семафоры на участках, переход от SQLite в другой базу данных ..

Я понимаю, что SQLite не является невероятно сильной база данных, так что я склоняюсь больше к переключаясь на другую базу данных , Какие-либо предложения?

Спасибо!

Код:

//generate a db connection// 
bool open(string filename){ 
    if(sqlite3_open(filename.c_str(), &database) == SQLITE_OK) 
    { 
     return true; 
    } 
    return false; 
} 

//Query database// 
vector<vector<string>> query(string query){ 
    sqlite3_stmt *statement; 
    vector<vector<string>> results; 

    if(sqlite3_prepare_v2(database, query.c_str(), -1, &statement, 0) == SQLITE_OK) 
    { 
     int cols = sqlite3_column_count(statement); 
     int result = 0; 
      while(true) 
     { 
      result = sqlite3_step(statement); 

      if(result == SQLITE_ROW) 
      { 
       vector<string> values; 
       for(int col = 0; col < cols; col++) 
       { 
        auto temp_val = (char*)sqlite3_column_text(statement, col); 
        if(!temp_val){ 
         cout << "FAIL" << endl; 
        } 
        else{ 
         values.emplace_back(temp_val); 
        } 
       } 
       results.push_back(values); 
      } 
      else 
      { 
       break; 
      } 
     } 

     sqlite3_finalize(statement); 
    } 

    string error = sqlite3_errmsg(database); 
    if(error != "not an error") cout << query << " " << error << endl; 

    return results; 
} 
void close(){ 
    sqlite3_close(database); 
} 
+0

Можете ли вы показать нам код, который вы используете для запроса БД? Используете ли вы одно соединение для нескольких потоков? Утверждение, что «sqlite не является невероятно сильной базой данных», на самом деле не так. –

+0

1 подключение к базе данных, несколько потоков, да. У меня создалось впечатление, что sqlite не так полно, как говорят mysql и т. Д., Поскольку это просто текстовый файл. –

ответ

1

Вы говорите, что вы используете одно соединение из нескольких потоков. Вероятно, это не лучшая идея, и в зависимости от параметров, настроенных в вашей конкретной установке SQLite, она может вообще не работать. Подробнее об этом см. Здесь: https://www.sqlite.org/threadsafe.html

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

+0

Спасибо! Создал отдельные соединения внутри каждого потока, и все работает плавно. –

Смежные вопросы