gpt4 book ai didi

c++ - MySQL数据库和内存之间的实体持久化

转载 作者:行者123 更新时间:2023-11-30 00:43:30 27 4
gpt4 key购买 nike

首先,我的实际问题

我在映射中有一个共享指针,当映射本身中除了共享指针之外没有其他引用时,我想从映射中删除该共享指针,以便释放目标。我怎样才能做到这一点?或者,有什么更好的设计可以解决我的问题?

背景如下:

出于怀旧之情,我一直在使用 MySQL 后端用 C++ 编写 MUD 引擎。我现在正处于持久实体(在这种情况下,诸如帐户、角色等)的阶段。我在找出实现此目的的最佳方法时遇到了一些困难,因此决定寻求一些建议。

我目前的持久化架构是这样的,以字符为例

字符实体->字符存储->字符持久化->MySQL

角色实体是指角色本身,类似于MVC中的模型。它除了数据之外没有任何东西,并且只知道其他实体。

字符存储是当前负责在内存中保存字符实体实例的容器。当请求通过 ID 或名称查找字符时,它会检查其内存,该内存被实现为包含 UUID 的 std::string 到 std::shared_ptr 的映射。如果内存中已经有一个实例,我们会传回一个共享指针,如果没有,我们会向持久层请求它,将其存储在映射中,然后将一个共享指针传回给它。

持久层是抽象的,有一个character_persistence接口(interface),它有mysql_character_persistence的具体实现,所以我可以轻松切换到不同形式的持久性。

最佳答案

我使用了引用计数和模板化的entity_ptr类型。

我创建了一个entity_ptr_provider接口(interface),它定义了方法obtain(uuid)和release(uuid)。一个entity_ptr采用实体类型(帐户、字符等)的模板化参数、该类型的实体和entity_ptr_provider。

在构造或复制entity_ptr类型时,它使用实体的UUID调用entity_ptr_provider上的获取,以便可以增加对它的引用,当它被解构时,它调用release,这允许entity_ptr_provider减少引用。当引用达到0时,将其从表中释放。

关于c++ - MySQL数据库和内存之间的实体持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21578296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com