最近事情比较多很久没有写学习笔记了,数据库线程池,+ 数据库封装,虽说数据库操作有很多不需要写sql 的,ORM 封装的方式去操作数据库。但是从业这些年一直是自己动手写sql ,还是改不了这个习惯。不说了直接上代码。
数据库线程池
ConnectionPool.h 文件
#ifndef CONNECTIONPOOL_H
#define CONNECTIONPOOL_H
#include <QtSql>
#include <QQueue>
#include <QString>
#include <QMutex>
#include <QMutexLocker>
#include "ConnectionPool.h"
class ConnectionPool {
public:
static void release(); // 关闭所有的数据库连接
static QSqlDatabase createConnection(); // 获取数据库连接
static void closeConnection(QSqlDatabase connection); // 释放数据库连接回连接池
~ConnectionPool();
private:
static ConnectionPool& getInstance();
ConnectionPool();
ConnectionPool(const ConnectionPool &other);
ConnectionPool& operator=(const ConnectionPool &other);
QSqlDatabase createConnection(const QString &connectionName); // 创建数据库连接
void initialize();
void loadConfigFile();
public:
QQueue<QString> usedConnectionNames; // 已使用的数据库连接名
QQueue<QString> unusedConnectionNames; // 未使用的数据库连接名
QJsonObject mJsonObject;
// 数据库信息
QString hostName;
QString databaseName;
QString username;
QString password;
QString databaseType;
int port;
bool testOnBorrow; // 取得连接的时候验证连接是否有效
QString testOnBorrowSql; // 测试访问数据库的 SQL
int maxWaitTime; // 获取连接最大等待时间
int waitInterval; // 尝试获取连接时等待间隔时间
int maxConnectionCount; // 最大连接数
static QMutex mutex;
static QWaitCondition waitConnection;
static ConnectionPool *instance;
};
#endif // CONNECTIONPOOL_H
ConnectionPool.cpp
#include "ConnectionPool.h"
#include <QDebug>
QMutex ConnectionPool::mutex;
QWaitCondition ConnectionPool::waitConnection;
ConnectionPool* ConnectionPool::instance = NULL;
ConnectionPool::ConnectionPool()
{
initialize();
}
ConnectionPool::~ConnectionPool()
{
// 销毁连接池的时候删除所有的连接
foreach(QString connectionName, usedConnectionNames)
{
QSqlDatabase::removeDatabase(connectionName);
}
foreach(QString connectionName, unusedConnectionNames)
{
QSqlDatabase::removeDatabase(connectionName);
}
}
void ConnectionPool::loadConfigFile()
{
QString path = qApp->applicationDirPath();
QString strFile;
strFile = path + "/config/DBConfig.json";
QFile file(strFile);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "could't open projects json";
return;
}
QString value = file.readAll();
file.close();
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
qDebug() << parseJsonErr.errorString();
return;
}
mJsonObject=document.object();
}
void ConnectionPool::initialize()
{
//loadConfigFile();
hostName = "127.0.0.1";
databaseName = "test";
username = "root";
password = "admin";
databaseType = "QMYSQL";
port = 3306;
testOnBorrow = true;
testOnBorrowSql = "SELECT 1";
waitInterval = 200;
maxWaitTime = 5000;
maxConnectionCount = 10;
}
ConnectionPool& ConnectionPool::getInstance()
{
if (NULL == instance)
{
QMutexLocker locker(&mutex);
if (NULL == instance)
{
instance = new ConnectionPool();
}
}
return *instance;
}
void ConnectionPool::release()
{
QMutexLocker locker(&mutex);
delete instance;
instance = NULL;
}
QSqlDatabase ConnectionPool::createConnection()
{