add db reconnect

This commit is contained in:
baiYue 2026-06-01 19:26:22 +08:00
parent ba2fb8211f
commit 3ee42e2eed
3 changed files with 95 additions and 35 deletions

View File

@ -29,7 +29,7 @@ public:
QSqlQuery executeBatchSQL(const QStringList& sqlStatements, bool createOrDrop = false,
const QList<QVariantList>& paramsList = QList<QVariantList>(), bool useTranscation = false);
static DataBase* GetInstance();
QSqlDatabase getDB(); // ✅ 线程安全入口
public:
bool insertPage(QString tag,QString name,QJsonObject label,QJsonObject context,QString description,int op);
bool insertStation(int zoneId,QString name,QString description,bool isLocal,int op);
@ -183,17 +183,13 @@ private:
QMap<int,ComponentTypeInfo> _componentType; //存储系统支持的类型列表
private:
void initial();
//bool createProjectDB();
//void initialProjectDB();
bool isDbValid(QSqlDatabase& db);
void readXML();
static DataBase* dbInstance;
static int _id;
QSqlDatabase db;
//QSqlDatabase prodb;
QString m_sFileName;
QString _DataBaseType;
QString _DataBaseName;
//QString _ProjectDB; //工程模数据库名
QString _HostName;
int _Port;
QString _UserName;

View File

@ -10,17 +10,26 @@
#include <QSqlDriver>
#include <QJsonDocument>
#include <QJsonArray>
#include <QMutex>
#include <QThread>
DataBase* DataBase::dbInstance = nullptr;
int DataBase::_id = 0;
DataBase::DataBase()
{
m_sFileName = QString("setting.xml");
m_sFileName = "setting.xml";
readXML(); // 读数据库配置
QSqlDatabase db = getDB();
if (!db.isOpen()) {
LOG_ERROR("DB", "Database not available");
return;
}
// ✅ 全局只执行一次的业务初始化
initial();
//createProjectDB();
//initialProjectDB();
createProjectManager();
}
DataBase::~DataBase()
@ -31,26 +40,6 @@ DataBase::~DataBase()
void DataBase::initial()
{
readXML();
if (QSqlDatabase::contains(_DataBaseName))
db = QSqlDatabase::database(_DataBaseName);
else
db = QSqlDatabase::addDatabase(_DataBaseType,_DataBaseName);
db.setDatabaseName(_DataBaseName);
db.setHostName(_HostName);
db.setPort(_Port);
// 需要改成自己的用户名和密码
db.setUserName(_UserName);
db.setPassword(_PassWord);
if (db.open()) {
qDebug()<<"baseDB success";
} else {
LOG_ERROR("DB", QString("Database not open"));
}
//元模
getAttributeGroup(); //获取属性组信息
getDataType(); //获取数据类型信息
getModelType(); //获取模型类型
@ -59,20 +48,71 @@ void DataBase::initial()
getModelAttribute();
getModelAttributePublic(); //获取公共属性组
getModelConnectivity(); //获取连接性
createProjectManager();
}
QSqlDatabase DataBase::getDB()
{
QString connName =
QString("db_%1").arg((quintptr)QThread::currentThreadId());
QSqlDatabase db;
if (QSqlDatabase::contains(connName)) {
db = QSqlDatabase::database(connName);
} else {
db = QSqlDatabase::addDatabase(_DataBaseType, connName);
db.setDatabaseName(_DataBaseName);
db.setHostName(_HostName);
db.setPort(_Port);
db.setUserName(_UserName);
db.setPassword(_PassWord);
}
// ✅ 只重连,不删
if (!isDbValid(db)) {
if (db.isOpen())
db.close();
if (!db.open()) {
LOG_ERROR("DB", db.lastError().text());
}
}
return db;
}
bool DataBase::isDbValid(QSqlDatabase& db)
{
if (!db.isOpen())
return false;
QSqlQuery query(db);
return query.exec("SELECT 1");
}
DataBase* DataBase::GetInstance()
{
if(dbInstance == nullptr)
{
dbInstance = new DataBase();
static QMutex mutex;
static DataBase* instance = nullptr;
if (!instance) {
QMutexLocker locker(&mutex);
if (!instance) {
instance = new DataBase();
}
}
return dbInstance;
// ✅ 在这里触发一次数据库连接检查
instance->getDB();
return instance;
}
QSqlQuery DataBase::executeSQL(const QString& strSQL,bool isDDL,const QVariantList& params, bool useTranscation)
{
//事务
QSqlDatabase db = getDB();
bool transactionStarted = false;
if(useTranscation)
{
@ -144,6 +184,7 @@ QSqlQuery DataBase::executeSQL(const QString& strSQL,bool isDDL,const QVariantLi
QSqlQuery DataBase::executeBatchSQL(const QStringList& sqlStatements, bool createOrDrop,const QList<QVariantList>& paramsList, bool useTranscation)
{
QSqlDatabase db = getDB();
//参数数量校验
if(!paramsList.isEmpty() && sqlStatements.size() != paramsList.size())
{
@ -229,6 +270,7 @@ QSqlQuery DataBase::executeBatchSQL(const QStringList& sqlStatements, bool creat
bool DataBase::insertComponent(QUuid uuid,QString modelName,QString nspath,QString tag,QString name,QString description,QString grid,QString zone,QString station,int type,bool inService,int state,int status,QJsonObject connected_bus,QJsonObject label,QJsonObject context,int op)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -270,6 +312,7 @@ bool DataBase::insertComponent(QUuid uuid,QString modelName,QString nspath,QStri
bool DataBase::updateComponent(QUuid uuid,QString tag,QString name,QJsonObject context,bool inService,int state,int status)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -373,6 +416,7 @@ bool DataBase::updateDynamicProperty(QUuid uuid,GroupStateValue groupValue)
bool DataBase::insertPage(QString tag,QString name,QJsonObject label,QJsonObject context,QString description,int op)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -406,6 +450,7 @@ bool DataBase::insertPage(QString tag,QString name,QJsonObject label,QJsonObject
bool DataBase::insertStation(int zoneId,QString name,QString description,bool isLocal,int op)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -433,6 +478,7 @@ bool DataBase::insertStation(int zoneId,QString name,QString description,bool is
bool DataBase::insertGrid(QString name,QString description,int op)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -456,6 +502,7 @@ bool DataBase::insertGrid(QString name,QString description,int op)
bool DataBase::insertZone(int grid_id,QString name,QString description,int op)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -480,6 +527,7 @@ bool DataBase::insertZone(int grid_id,QString name,QString description,int op)
bool DataBase::insertTopologic(QUuid uuid_from,QUuid uuid_to,QJsonObject context,int flag,QString description,int op)
{
QSqlDatabase db = getDB();
QJsonDocument contextDoc(context);
QString strContext = contextDoc.toJson(QJsonDocument::Compact);
@ -761,6 +809,7 @@ bool DataBase::deleteTopologic(QUuid fromPin,QUuid toPin)
/************************************************************/
ComponentInfo DataBase::getComponentInfoByUuid(QString uuid)
{
QSqlDatabase db = getDB();
ComponentInfo inf;
if(db.open())
{
@ -804,6 +853,7 @@ ComponentInfo DataBase::getComponentInfoByUuid(QString uuid)
QList<ComponentInfo> DataBase::getAllComponents()
{
QSqlDatabase db = getDB();
QList<ComponentInfo> lst;
if(db.open())
{
@ -847,6 +897,7 @@ QList<ComponentInfo> DataBase::getAllComponents()
bool DataBase::componentExist(QString uuid)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -874,6 +925,7 @@ bool DataBase::componentExist(QString uuid)
bool DataBase::deleteComponent(QString uuid)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -894,6 +946,7 @@ bool DataBase::deleteComponent(QString uuid)
QMap<int,ComponentTypeInfo> DataBase::getAllComponentType()
{
QSqlDatabase db = getDB();
if(_componentType.empty())
{
QMap<int,ComponentTypeInfo> map;
@ -932,6 +985,7 @@ QMap<int,ComponentTypeInfo> DataBase::getAllComponentType()
bool DataBase::updatePage(QString tag,QString name,QJsonObject context)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -962,6 +1016,7 @@ bool DataBase::updatePage(QString tag,QString name,QJsonObject context)
int DataBase::getPageIdByName(QString name)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -993,6 +1048,7 @@ int DataBase::getPageIdByName(QString name)
QJsonObject DataBase::getPageContextByName(QString name)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -1058,6 +1114,7 @@ QList<PageInfo> DataBase::getAllPage()
bool DataBase::deleteComponentById(int id)
{
QSqlDatabase db = getDB();
if(db.open())
{
QSqlQuery qry(db);
@ -2561,6 +2618,7 @@ bool DataBase::deleteProjectSetting(const QString& baseModel,const QString& mode
bool DataBase::createProjectManager()
{
QSqlDatabase db = getDB();
QString strSQL = R"(
CREATE TABLE IF NOT EXISTS project_manager (
id SERIAL NOT NULL PRIMARY KEY,
@ -3284,6 +3342,7 @@ bool DataBase::createDynamicTable(const QString &tableName, const QStringList &f
bool DataBase::deleteProjectModel(const QString& sProject)
{
QSqlDatabase db = getDB();
QStringList lstTable;
QString strSQL = "SELECT name FROM project_manager WHERE tag = ?";
QVariantList params;
@ -3459,6 +3518,7 @@ bool DataBase::deleteRecordFromManager(const QString& sProject,const QString& sG
bool DataBase::modifyProjectTable(QString sTable,QMap<QString,QString> mOld,QMap<QString,QString> mNew)
{
QSqlDatabase db = getDB();
QStringList sqlStatements;
for (auto &col : mOld.keys()) {
if (!mNew.contains(col)) {

View File

@ -62,7 +62,11 @@ CMainWindow::~CMainWindow()
//if(m_pElectricElementsBox)
//delete m_pElectricElementsBox;
if(m_pPropertiesEditorView){
auto pView = m_pPropertiesEditorView->getQuickDetailsView();
if(pView){
pView->disconnect();
delete pView;
}
m_pPropertiesEditorView->deleteLater();
}
}