SQLite查询返回"未知错误"

时间:2015-02-04 04:54:06

标签: c++ sqlite

我正在开发一个多线程cpp应用程序,它从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);
}

1 个答案:

答案 0 :(得分:1)

您说您正在使用来自多个线程的单个连接。这可能不是最好的主意,并且根据您在特定SQLite安装中配置的选项,它可能根本不起作用。有关详情,请参阅此处:https://www.sqlite.org/threadsafe.html

正如您所看到的,对问题进行全面诊断需要查看SQLite包的构建方式......但您可以尝试设置运行时选项以查看是否有帮助,如上页所述。