我正在开发一个多线程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);
}
答案 0 :(得分:1)
您说您正在使用来自多个线程的单个连接。这可能不是最好的主意,并且根据您在特定SQLite安装中配置的选项,它可能根本不起作用。有关详情,请参阅此处:https://www.sqlite.org/threadsafe.html
正如您所看到的,对问题进行全面诊断需要查看SQLite包的构建方式......但您可以尝试设置运行时选项以查看是否有帮助,如上页所述。