#include "data_source.h"
#include "QDebug"
Data_source* Data_source::instance = nullptr; //静态属性、所有类对象的该属性结果都相同
QMutex mutex;
Data_source::Data_source()
{
//创建数据库
db_connect();
}
void Data_source::db_connect()
{
//只查询数据、不加密
qDebug() << "插件:" << QSqlDatabase::drivers();
// QSqlDatabase db;
// if(QSqlDatabase::contains("qt_sql_default_connection"))
// {
// db = QSqlDatabase::database("qt_sql_default_connection");
// }
// else
// {
// db = QSqlDatabase::addDatabase("SQLITECIPHER");
// }
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("company_voice.db"); //如果这个数据库存在、则操作他、如果不存在则创建他、并且后续操作
db.setUserName("Boact_root"); //sqllite的用户名和密码、可写可不写。
db.setPassword("Boach231");
//如果连接成功
if (db.open())
{
qDebug() << "连接成功-";
//查询 通过全局指针变量query指向连接成功的地址。
query = new QSqlQuery(db);
}
//如果连接失败
else
{
qDebug() << "连接失败";
}
}
Data_source *Data_source::getInstance()
{
//当多线程获取该单例的时候、有可能引发竞态状态
static QMutex mutex;
if(!instance)
{
QMutexLocker locker(&mutex); //加锁,解决线程安全的问题
if(!instance)
{
qDebug()<<"new Data_source";
instance = new Data_source; //注意内存泄露问题
}
}
return instance;
}
Qt 单例模式 创建一个连接对象、多次使用sql链接
需积分: 0 24 浏览量
更新于2023-01-11
收藏 5KB RAR 举报
在编程领域,单例模式是一种常用的软件设计模式,它的核心思想是确保类只有一个实例,并提供一个全局访问点。在Qt框架中,当我们需要频繁地访问数据库或者共享同一个数据库连接时,使用单例模式来创建QSqlDatabase对象可以避免频繁创建和销毁数据库连接,从而提高性能并减少内存开销。下面我们将详细探讨如何在Qt中实现单例模式,以及如何利用它来创建和管理QSqlDatabase对象。
理解单例模式的基本原理。单例模式确保类的实例只有一个,并提供一个全局访问点,防止对同一资源的多个实例化。在C++中,我们通常通过私有构造函数和静态成员函数来实现单例模式。对于Qt中的QSqlDatabase,我们可以创建一个名为`DBManager`的类,用于管理数据库连接的单例。
```cpp
class DBManager {
private:
// 私有构造函数,防止外部直接创建实例
DBManager() {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("localhost"); // 根据实际情况设置
db.setDatabaseName("/path/to/your/database.db"); // 设置数据库路径
if (!db.open()) { // 打开数据库
qDebug() << "Failed to open the database: " << db.lastError().text();
}
}
// 私有复制构造函数和赋值运算符,防止复制实例
DBManager(const DBManager&) = delete;
DBManager& operator=(const DBManager&) = delete;
// 数据库连接对象
QSqlDatabase db;
public:
// 静态成员函数,提供全局访问点
static DBManager* getInstance() {
static DBManager instance; // 懒汉式单例,首次调用时实例化
return &instance;
}
// 提供数据库操作接口
QSqlDatabase getDatabase() {
return db;
}
// 其他数据库操作方法...
};
```
如上代码所示,`DBManager`类的构造函数和析构函数都是私有的,确保了不能从类外部创建或删除实例。`getInstance()`方法是静态成员函数,返回的是类的唯一实例。首次调用`getInstance()`时,会创建并初始化`DBManager`对象,后续调用则直接返回已存在的实例,这就是所谓的“懒汉式”单例。
在实际应用中,你可以通过`DBManager::getInstance()->getDatabase()`获取到QSqlDatabase对象,然后进行SQL查询和其他数据库操作,而无需每次操作都创建新的连接,这样可以有效地减少堆区内存的分配和释放,提高程序效率。
例如,你可以在任何地方使用以下方式获取数据库连接:
```cpp
QSqlDatabase db = DBManager::getInstance()->getDatabase();
QSqlQuery query(db);
query.prepare("SELECT * FROM table_name");
if (query.exec()) {
while (query.next()) {
// 处理查询结果...
}
}
```
此外,为了确保程序退出时能正确关闭数据库连接,你可以在`DBManager`类中添加一个析构函数,关闭数据库连接。这通常在单例模式中不是必须的,因为Qt应用程序结束时会自动清理所有资源,但如果你的应用场景需要提前关闭连接,可以考虑实现。
Qt中的单例模式结合QSqlDatabase可以有效地管理数据库连接,提高代码的复用性和效率,同时降低内存管理的压力。通过使用`DBManager`类,我们可以方便地在多个地方共享同一个数据库连接,避免了不必要的资源消耗。在实际开发中,根据项目的具体需求,还可以扩展`DBManager`类,增加更多的数据库操作功能。
鼎鼎_home
- 粉丝: 18
- 资源: 12
最新资源
- 【岗位说明】公司行政岗位职责.doc
- 【岗位说明】公司行政副总岗位说明书.doc
- 【岗位说明】公司行政文职类岗位职责.doc
- 【岗位说明】行政部岗位职责.doc
- 【岗位说明】公司组织结构及部门职责.doc
- 【岗位说明】行政部锅炉工岗位说明书.doc
- 【岗位说明】行政部各职位说明书.doc
- 【岗位说明】行政部门岗位职责02.doc
- 【岗位说明】行政后勤岗位职责.doc
- 【岗位说明】行政经理岗位说明书.doc
- 【岗位说明】行政前台岗位职责.doc
- 【岗位说明】行政经理岗位职责.doc
- 【岗位说明】行政前台岗位职责及工作要求.doc
- 【岗位说明】行政人事部部门职责(制造业).doc
- 【岗位说明】行政人事部部门职责说明书(计算机企业).doc
- 【岗位说明】行政人事部部门职责说明书(旅游公司).doc