栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

数据库连接池

数据库连接池

实现过程
#pragma once
#include "qtdatabasemodel_global.h"
#include 
#include "QMutex"
#include 

class QTDATAbaseMODEL_EXPORT DatabaseUtil
{
public:
	DatabaseUtil();
	~DatabaseUtil();
	
	void setDatabaseInfo(QString strDatabaseIp, QString strDatabaseName, QString strAccount, QString strPassword, QString strDrive);

	
	QSqlDatabase getNewConnection(const QString& connectName);
	
	    
	void closeConnection(const QString& connectName);

private:
	//@brief 地址
	QString m_strDatabaseIp;
	//@brief 数据库名称
	QString m_strDatabaseName;
	//@brief 账号
	QString m_strAccount;
	//@brief 密码
	QString m_strPassword;
	//@brief 驱动类型
	QString m_strDrive;
	//@brief 锁
	static QMutex mutex;
	//@brief 已连接的数据名
	QStack m_usedConnectionName;
};

#include "DatabaseUtil.h"
#include 
#include 
#include "QSqlError"

QMutex DatabaseUtil::mutex;
DatabaseUtil::DatabaseUtil()
{

}

DatabaseUtil::~DatabaseUtil()
{
	//销毁所有正在连接的数据库
	for each (auto var in m_usedConnectionName)
	{
		getNewConnection(var).close();
		if (QSqlDatabase::contains(var))
		{
			closeConnection(var);
		}
	}
}

void DatabaseUtil::setDatabaseInfo(QString strDatabaseIp, QString strDatabaseName, QString strAccount, QString strPassword, QString strDrive)
{
	m_strDatabaseIp = strDatabaseIp;
	m_strDatabaseName = strDatabaseName;
	m_strAccount = strAccount;
	m_strPassword = strPassword;
	m_strDrive = strDrive;
}

QSqlDatabase DatabaseUtil::getNewConnection(const QString& connectName)
{
	QMutexLocker tempLock(&mutex);
	if (QSqlDatabase::contains(connectName))
	{
		QSqlDatabase tempDB = QSqlDatabase::database(connectName);
		if (!tempDB.isOpen())
		{
			tempDB.open();
		}
		//测试数据连接通畅性
		if (!tempDB.isOpenError())
		{
			QSqlQuery query = tempDB.exec("SELECT 0;");
			if (query.lastError().type() == QSqlError::NoError)
			{
				return tempDB;
			}
		}
		return QSqlDatabase();
	}
	else
	{
		QSqlDatabase db = QSqlDatabase::addDatabase(m_strDrive, connectName);

		db.setDatabaseName(QString("DRIVER={SQL SERVER};"
			"SERVER=%1;" //服务器名称
			"DATAbase=%2;"//数据库名
			"UID=%3;"           //登录名
			"PWD=%4;"        //密码
		)
			.arg(m_strDatabaseIp)
			.arg(m_strDatabaseName)
			.arg(m_strAccount)
			.arg(m_strPassword)
		);

		db.setConnectOptions("SQL_ATTR_LOGIN_TIMEOUT=2");
		db.connectOptions();
		if (db.open())
		{
			m_usedConnectionName.append(connectName);
			return db;
		}
		else
		{
			return QSqlDatabase();
		}
	}
}

void DatabaseUtil::closeConnection(const QString & connectName)
{
	QMutexLocker tempLock(&mutex);
	if (QSqlDatabase::contains(connectName))
	{
		QSqlDatabase tempDB = QSqlDatabase::database(connectName);
		if (tempDB.isOpen())
		{
			tempDB.close();
		}
		QSqlDatabase::removeDatabase(connectName);
	}
}



调用
	QString LogInfo;
	LogInfo.sprintf("%p", QThread::currentThread());
	auto db = getNewConnection(LogInfo);

获取线程的ID,作为数据库的连接名。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/342716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号