- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
基于 Qt 文档:
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
困扰我的问题是,当我复制构建数据库实例时会发生什么。例如,这里是主线程中的代码:
int main(int argc, char** argv) {
...
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DB1");
db.setHostName("localhost");
...
这是工作线程线程中的连接:
void MyThread::run() {
QSqlDatabase db(QSqlDatabase::database("DB1"));
if (db.open()) {
...
}
这个线程安全吗?通常,这样的操作在 C++ 中是安全的,但由于 QT 使用隐式共享和线程关联,我不再确定。
他们说:一个连接只能在创建它的线程中使用,但这是什么意思? 是创建连接的QSqlDatabase::addDatabase点还是实际调用open()函数时的位置。
更新:
在 Laszlo Papp 的回答之后,并最终查看了 Qt 源代码,我必须说 Qt 这部分的设计在我看来是有缺陷的。
如果我理解正确,QSqlDatabase 在底层使用隐式共享,但不幸的是它不是真正的隐式共享,因为 QSqlDatabase 实例的复制构造函数不会在需要时创建共享数据的新实例。更糟糕的是,您不能创建临时连接,而是必须使用静态方法 addDatabase/removeDatabase,在这种情况下,您必须同步线程以避免名称冲突。
这当然使得在 QtConcurrent 中使用 QSqlDatabase 变得非常困难,特别是如果连接应该深埋在某些抽象之后。由于我们不知道代码将在哪个线程上运行,因此我们无法在两个调用之间保持连接打开。如果我们想生成动态数量的任务,我们需要确保任务不使用相同的数据库名称。
所有这些让我想知道设计目标以及隐式共享是否适合这种特殊情况。恕我直言,更好的解决方案是让复制构造函数真正完成它并为您制作连接拷贝。那些不想拥有私有(private)/临时拷贝的人,仍然可以使用 addDatebase/removeDatabase,在这种情况下,方法 database() 需要修改以返回引用。
最佳答案
They say: A connection can only be used from within the thread that created it, but what does that mean? Is QSqlDatabase::addDatabase point where connection is created or it actually when open() function is called.
前者。见 documentation详情:
The QSqlDatabase class represents a connection to a database.
The QSqlDatabase class provides an interface for accessing a database through a connection. An instance of QSqlDatabase represents the connection. The connection provides access to the database via one of the supported database drivers, which are derived from QSqlDriver. Alternatively, you can subclass your own database driver from QSqlDriver. See How to Write Your Own Database Driver for more information.
Create a connection (i.e., an instance of QSqlDatabase) by calling one of the static addDatabase() functions...
最后一句话应该可以解决您的疑虑。
关于c++ - 在多线程程序中正确使用 QSqlDatabase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20793689/
我已经创建了一个肯定存在于项目目录中的数据库,我可以使用 DBBrowser 和 Ubuntu 终端打开它。它们都显示数据库包含“电影”表,但我在 C++ 中的代码说找不到这样的表 QSqlDatab
我只有一个与数据库的连接,用于我正在开发的库存应用程序。 我现在正在做的是每次需要对 dB 进行查询时调用 open(),然后执行 close()。 这样做比仅仅打开连接并保持打开状态有什么好处吗?
我需要在本地系统上存储一些值并稍后以表格格式访问它,所以我选择了 QSqlDatabase。首先我必须检查数据库是否已经存在。但是使用下面的代码我总是收到消息 Data base not exist
from PyQt4 import QtGui,QtSql def start_prestige(): m_name = "Prestige" m_desc = "
为什么下面的代码打印的是 true 而不是 false? int main(int argc, char *argv[]) { QApplication a(argc, argv);
基于 Qt 文档: A connection can only be used from within the thread that created it. Moving connections b
我正在运行来自 http://www.python.org/getit/ 的 python 2.7.3 (python-2.7.3.amd64.msi) 我使用的安装程序来自:http://www.l
我正在使用 QSqlDatabase 并试图找到一种方法来终止正在运行的查询(这是我正在编写的 sql 客户端的一种必要功能) 有没有办法获取正在运行的查询的 ID? (计划只是在另一个连接中执行 k
很多QSqlDatabase的教程都是这样启动数据库的: QSqlDatabase cn = QSqlDatabase::addDatabase("QSQLITE",QString::number(i
我有一个 Qt 应用程序,它(本质上)使用 QSqlDatabase 创建一个 QMYSQL 数据库连接,创建一个 gridPopulator 实例来填充一个 QTableView 带有(显然)来自数
处理 QSqlDatabase 连接的正确方法是什么? 在我的程序中我是这样做的: DatabaseConnector *databaseConnector = 0; try { databa
我有依赖类和独立类,我需要在这些类中创建数据库连接。据我了解Qt documentation ,如果我以默认方式创建连接,则所有连接都使用相同的连接。 我应该为不同的类创建不同的数据库连接,还是应该使
我对手册感到困惑,我应该这样工作吗: { QSqlDatabase db = QSqlDatabase::addDatabase (...); QSqlQuery query (db); que
我有一个多年来一直运行良好的功能,开始 QSqlDatabase DBUtil :: basic_open (const QString & path) { static int connec
在我的开发电脑中,“QSqlDatabase ob”行不会崩溃并且工作得很好。但是在一台新的电脑上移动了 exe,它崩溃了,但是如果我注释上面的行并再次准备 exe,它就可以正常运行。 所以我在新电脑
我刚刚完成了 QT CRUD 应用程序的开发。我使用 SQLite 将信息本地存储在运行应用程序的磁盘中。这样我的应用程序就可以正常工作了。 但是该应用程序缺少中央数据库服务器。因此,我首先安装 My
将 Qt 从 5.5 更新到 5.6 后,QSqlDatabase:open 始终返回 true - 即使主机不可访问和/或用户名/密码/数据库设置设置为无意义。 测试代码: QSqlDatabase
文件对此只字不提。我只是想知道 exec() 调用是否阻塞?意思是,如果我先创建一个表,然后启动一个线程,在线程中我调用一个对我刚创建的表的查询。 是否有可能在实际建表之前调用查询? 最佳答案 是的,
我正在尝试使用 .open() 函数在 QT 中打开一个 sqlite 数据库文件,如果文件没有退出,.open() 不会返回 false,它只是在给定的位置创建一个新文件目录。我的代码: QSqlD
我正在做一个使用 QSqlDatabase 的项目。现在我正在使用 QtConcurrent (QFuture) 来执行任何 SQL 命令。 现在,使用 QFuture 运行的每个新命令都会创建新的
我是一名优秀的程序员,十分优秀!