【问题标题】:Retain array in memory on application restart在应用程序重新启动时将数组保留在内存中
【发布时间】: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.写/加载文件不是一个选项吗?数据?

标签: c++ qt memory


【解决方案1】:

提示:关注点分离 您可以使用单独的进程来处理/存储凭据。

【讨论】:

  • 这可能指向正确的方法,但是对于答案,请考虑您甚至没有写一个完整的句子...
  • 或者只是修复崩溃;)
  • 如果那个进程也崩溃了怎么办?
  • SESSION 对象包含大量用户数据,例如用户特定的数据库连接、指针、数据等,我认为这些数据无法使用 IPC 进行通信
【解决方案2】:

当您创建/更新会话时,您可以将会话保存在数据库/文件中吗?每当您启动服务器时,请恢复它们。

【讨论】:

  • 这是最好的方法,因为应用程序似乎已经与 DB 建立了连接......并且可能在启动时再次重新构建 SESSION 对象
  • 不能这样做,因为 SESSION 对象是包含指针的复杂对象,而且很少有不支持序列化的对象。
  • @Antony 那么您必须为它们添加序列化支持,因为您需要对它们进行序列化。在最坏的情况下,需要进行更根本的改变。
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 2010-12-18
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多