我想分离与主线程的Db交互。连接将子类QRunnable
并开始在run()
函数中打开连接,连接管理器将保存QthreadPool
并在需要查询时启动该任务。在三层体系结构中实现线程:无法打开数据库
但问题是它保持报告无法打开数据库,如果我使用相同的代码在一个简单的main()
,它运作良好。所以我不知道?
任何想法表示赞赏:)
这里是我的实现:
#include <Qt/QtSql>
#include <QRunnable>
class DbConnection : public QRunnable
{
private:
QSqlDatabase db;
bool isConnectToDB;
public:
DbConnection();
QSqlDatabase getDb() const;
void setDb(const QSqlDatabase &value);
bool getIsConnectToDB() const;
void setIsConnectToDB(bool value);
void run();
void openConnToDB();
};
QSqlDatabase DbConnection::getDb() const
{
return db;
}
void DbConnection::setDb(const QSqlDatabase &value)
{
db = value;
}
bool DbConnection::getIsConnectToDB() const
{
return isConnectToDB;
}
void DbConnection::setIsConnectToDB(bool value)
{
isConnectToDB = value;
}
void DbConnection::run()
{
openConnToDB();
qDebug()<< "Open a connection from thread" << QThread::currentThread();
}
void DbConnection::openConnToDB() //=> work well in a simple test program
{
db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("postgres");
db.setPassword("1");
db.setPort(5432);
isConnectToDB = db.open("postgres","1");;
//usleep(100000);
}
DbConnection::DbConnection()
{
}
class DBConnManager
{
private:
DBConnManager();
static DBConnManager *m_Instance;
QThreadPool *threadPool;
QList<DbConnection *> connList;
DbConnection* conn;
public:
static DBConnManager *getInstance();
QList<DbConnection *> getConnList() const;
void setConnList(const QList<DbConnection *> &value);
QSqlDatabase acquireDb();
DbConnection *getConn() const;
void setConn(DbConnection *value);
void closeDb();
};
DBConnManager *DBConnManager::m_Instance = 0;
DBConnManager::DBConnManager()
{
threadPool = QThreadPool::globalInstance();
}
DbConnection *DBConnManager::getConn() const
{
return conn;
}
void DBConnManager::setConn(DbConnection *value)
{
conn = value;
}
void DBConnManager::closeDb()
{
if (conn==NULL) {
qDebug()<< "NULL connection pointer";
return;
}
conn->getDb().close();
}
QList<DbConnection *> DBConnManager::getConnList() const
{
return connList;
}
void DBConnManager::setConnList(const QList<DbConnection *> &value)
{
connList = value;
}
QSqlDatabase DBConnManager::acquireDb()
{
conn = new DbConnection;
connList.append(conn);
threadPool->start(conn);
// QSqlDatabase tmp;
// return tmp;
return conn->getDb();
}
DBConnManager *DBConnManager::getInstance()
{
if (!m_Instance) {
m_Instance = new DBConnManager;
}
return m_Instance;
}
,这是在这一切开始:
QList<arcEntity> arcBL::getAll()
{
QList <arcEntity> listResult;
QSqlDatabase db = DBConnManager::getInstance()->acquireDb();
bool result = m_arcDAL.getAll(&db,listResult);
if (result==false) {
qDebug()<<"Query get all fail";
}
DBConnManager::getInstance()->closeDb();
return listResult;
}
谢谢指出:)非常丰富的:)目前,我实现了一个类似于你的'DBQuery'的'Worker'类子类'QThread'。完成后我会再次反馈:) – Tiana987642 2014-09-07 17:10:59