我有一个单例类,用于管理来自多个线程的数据库访问。该课程必须符合以下要求:
我当前的解决方案使用QReadWriteLock
来处理同步,但是所有线程都使用单个数据库连接,这是不安全的。以下是简化版。
class ResourceManager
{
public:
bool initialize(const QString& databasePath);
bool shutdown();
static ResourceManager& get()
{
static ResourceManager instance;
return instance;
}
QByteArray getResource(int resourceId)
{
QReadLocker locker(m_lock);
QSqlQuery query(m_db);
// ...
}
bool setResource(int resourceId, QByteArray data)
{
QWriteLocker locker(m_lock);
QSqlQuery query(m_db)
// ...
}
private:
QSqlDatabase m_db;
QReadWriteLock m_lock;
}
我的想法是实现某种连接缓存,如下所示:
QHash<ThreadHandle, QString> m_connectionCache; // thread handle - connection name
// then
if (!m_connectionCache[QThread::currentThread]) // Create new connection
QSqlQuery query(m_connectionCache[QThread::currentThread]);
这里的问题是我无法想象一个好的清理机制可以摆脱不再需要的连接,因此地图将随着每个新线程不断成长。
这看起来是个好主意吗?还有其他建议吗?
答案 0 :(得分:0)
可以通过名称访问连接,但是您将QString
传递给QSqlQuery
的构造函数,此字符串被视为SQL查询,但不是连接名。
幸运的是QSqlDatabase
包含您需要的缓存。可以通过QSqlDatabase::connectionNames阅读并按QSqlDatabase::addDatabase