【发布时间】:2018-10-13 07:59:46
【问题描述】:
我有一个 C++ 后端服务器应用程序。当我们的用户登录到应用程序时,会为每个用户创建一个 SESSION 对象(包含数据库连接、访问权限、指针等的复杂 C++ 对象)。然后将该对象保存在一个数组中。我正在使用批处理脚本来重启应用程序以防崩溃。
问题是,如果应用程序崩溃,SESSIONS 数组会被销毁。当应用程序再次启动时,数组为空。因此,用户需要重新登录。
是否有任何方法可以在应用程序重新启动时保留 SESSIONS 数组?
我使用的是 Qt 5.5 框架,操作系统是 Ubuntu Linux。
代码:
static QHash<QString,Session*> sessions
class Session {
bool logged_in;
QString aID;
QString sID;
QMap<QString,QMap>;
QMap<QString,QVariant> m_vars;
bool m_database;
int m_minutes;
QTimer* m_sessionTimer;
bool m_valid;
CustomClass* CustomClass;
CustomClass2* CustomClass;
QTimer* timer;
QList <CustomClass3*> objects;
}
CustomClass {
//15 getter-setter functions...
CustomClassInterface interface; //PIMPL
}
CustomClassInterface {
DatabaseClass database;
CustomUserClass userClass;
//...More 5-6 QList items
}
CustomClass2 {
//15 getter-setter functions...
CustomClass2Interface interface; //PIMPL
}
CustomClass2Interface {
DatabaseClass database;
CustomUserClass userClass;
//...More 5-6 QList items
}
...
The class is huge so I can't write the whole code here
为所有类添加序列化需要重写一堆库。那么,没有实现序列化就没有其他方法了。比如 mmap 什么的。
【问题讨论】:
-
我认为你想在创建对象时对其进行序列化
-
你能把你的会话类的结构贴出来
-
一种可能(更好)的方法是在数据库表中保持登录状态
-
我不这么认为。操作系统在进程退出后清理内存等资源至关重要。异常可能是共享内存/内存映射文件。用resp.写/加载文件不是一个选项吗?数据?