问题标签 [mnesia]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
595 浏览

functional-programming - 我应该采取多远的参考透明度?

我正在使用 erlang、mnesia 和 webmachine 构建一个网站。我读过的大多数文档都赞扬了具有引用透明功能的优点。

问题是,所有数据库访问都是外部状态。这意味着访问数据库的任何方法都不再是引用透明的。

假设我在数据库中有一个用户对象和一些处理身份验证的函数。

引用不透明函数可能如下所示:

引用透明性要求我尽量减少引用不透明代码的数量,因此调用者必须从数据库中获取对象并将其作为参数传递给函数:

上面的代码显然不是生产代码 - 它纯粹是为了说明目的而组成的。

我不想陷入教条。引用透明代码(如可证明的单元测试)的好处是否证明了不太友好的界面?在追求参照透明方面我应该走多远?

0 投票
2 回答
2898 浏览

erlang - 节点之间的 Erlang Ets 表

我有一个运行大量自定义模块的 ejabberd 服务器。我有几个 mnesia 表,我知道这些表可以很容易地在节点之间复制,而无需对代码进行任何更改。我想知道ets表是否有类似的方法?

理想情况下,能够让多台机器运行完全相同的 mnesia 和 ets 数据会很好,而不必将我的 ets 表转换为 mnesia 表。(因此重写了大量的代码。)

虽然我曾经对每个节点的 ets 表执行 rpc:call,但我不确定这会对性能产生什么影响。

如果有人有任何答案,请告诉我。

0 投票
2 回答
5158 浏览

database - Erlang:Mnesia:连续更新单个字段值

我有一个 mnesia 表,其中包含使用记录创建的三个字段 i、a 和 b

现在我在表中插入一行:

现在,如果我想更新这一行,并且只将 a 的值更改为 10,同时让 i 和 b 具有相同的值,我该怎么办?有没有类似“ UPDATE T SET a=10 WHERE i=1”的SQL等价物?

如果我做这样的事情:

该行存储为:

0 投票
4 回答
3958 浏览

database - Erlang : Mnesia : 基于键以外的字段进行查找和更新

我在 mnesia 中有一个表,我需要更新其中记录中的各个字段。根据Erlang : Mnesia :如果我执行以下操作,则连续更新单个字段值:

现在据我了解,上面的代码P基于 a读取记录Key,获取记录上的写锁,以便在读取和写回(或简而言之,更新)时没有其他事务修改该记录。到现在为止还挺好。

现在我的要求是我需要能够读取基于Key表中的和另一个字段的记录,然后对其执行更新。执行此查找的函数是mnesia:match_object. 现在的问题是,根据http://www.erlang.org/doc/man/mnesia.html#match_object-3 ,该函数只支持读锁,不支持写锁。

这样做的结果是,假设在上面的函数中我要使用 mnesia:match_object,我将得到一个(组)记录,所有记录都带有读锁。读取记录后,我需要对检索到的数据进行一些检查,然后仅在满足条件时才写回更新的记录。现在,假设有两个并行事务 T1 和 T2 由两个不同的源在运行。T1 和 T2 都同时访问同一个记录。由于它们是读锁定的,因此 T1 和 T2 都可以并行读取记录。T1 和 T2 都将对同一条记录执行相同的检查,如果条件匹配,则两者都将继续执行更新。但是,在我的代码中,如果 T1 和 T2 连续执行,T1 会更改记录,而在 T2 中,

简而言之,我需要编写 mnesia:match_object 返回的锁记录。该文档明确指出仅支持读锁。有其他选择吗?

更新: 我一直在尝试一些,我认为可能的解决方案是使用复合键。假设我将数据写入如下表:

有什么方法可以查找条目,使用不关心?

我尝试了这些,但都返回了空结果:

0 投票
2 回答
2365 浏览

erlang - Erlang:为 mnesia 指定工作目录?

如何在mnesia不通过命令行传递“dir”参数的情况下指定工作目录?

换句话说,我可以在调用 `mnesia:start()' 之前为 mnesia 指定一个“工作目录”吗?

0 投票
3 回答
610 浏览

erlang - Erlang:多次调用 mnesia:create_schema 的副作用?

mnesia:create_schema()在每个应用程序启动时调用是否有副作用?

从我继续阅读的内容来看,每个数据库实例只应调用此函数一次。在现有数据库上多次调用它是一个大问题吗?

0 投票
3 回答
1043 浏览

database - 分析 Mnesia 查询

我们的 Mnesia DB 运行缓慢,我们认为它应该更快一些。

因此,我们需要对其进行分析并找出正在发生的事情。

有许多选项可以自我暗示:

  • 运行 fprof 并查看时间在哪里
  • 运行 cprof 看看哪些函数被调用了很多

然而,这些都是相当标准的性能监控风格工具。问题是我如何实际进行查询分析 - 哪些查询花费的时间最长。如果我们是 Oracle 或 MySQL 商店,我们只需运行一个查询分析器,它会返回需要很长时间才能运行的各种查询。这似乎不是 Mnesia 可用的工具。

所以问题是:

  • 有哪些技术可以描述 Mnesia
  • 有哪些工具可以用来描述 Mnesia - 我认为没有,但证明我错了 :)
  • 你是如何分析你的查询和优化你的 mnesia 数据库安装的

根据讨论展开

fprof 作为分析工具的问题之一是它只告诉您正在查看的特定查询。所以 fprof 告诉我 X 很慢,我将其调低以加快速度。然后,低,看,操作 Y(足够快)现在变得很慢。所以我分析了 Y 并意识到让 Y 快的方法就是让 X 慢。所以我最终做了一系列双边权衡......

我真正需要的是一种管理多边权衡的方法。我现在记录了 2 个度量标准的实际用户活动负载,我可以重播这些活动。这些日志代表我想要优化的内容。

SQL 数据库上的“适当”查询分析器将能够分析 SQL 语句的结构,例如所有具有以下形式的语句:

并且说这种形式的 285 个查询平均需要 0.37 毫秒才能运行

他们神奇的答案是当它说:这种形式的 17 个查询运行了 6.34 秒并对表 X 进行了全表扫描,你应该在字段 Y 上放置一个索引

当我在一组具有代表性的用户活动上得到这样的结果集时,我就可以开始全面考虑权衡取舍 - 并设计一个测试模式。

测试模式将类似于:

  • 活动 X 将使查询 A、C 和 C 更快,但查询 E 和 F 更慢
  • 测试和测量
  • 然后批准/不批准

我已经使用 Erlang 足够长的时间来“知道”没有像这样的查询分析器,我想知道其他人(他们一定有这个问题)是如何对 mnesia 优化的“原因”。

0 投票
3 回答
3097 浏览

erlang - Ejabberd 内存消耗(或泄漏?)

我在我们的服务器上使用 ejabberd + mochiweb。我让 ejabberd 和 mochiweb 运行的时间越长,消耗的内存就越多(昨晚它消耗了 35% 的内存。现在它有点高于 50%)。我认为这只是一个 mnesia 垃圾收集问题 - 所以我安装了 Erlang R13B3 并重新启动了 ejabberd。但这并没有解决它。

所以我现在注意到,在完全内存消耗的 50% 以上时,看起来 ejabberd 开始“释放”内存并保持在 50% 左右。这是正常的吗?约 50% 是 ejabberd 的阈值吗,所以当它达到它时,它会说,“嘿,是时候让一些内存消失了……”也许它会保留其余部分以便快速访问(比如缓存 mnesia?)

我很感激任何意见。谢谢!

0 投票
3 回答
928 浏览

erlang - Mnesia 异步事务

我想有一个 Erlang 节点的主从设置,其中读写操作只发生在主节点上。从节点仅保留为热备份。

据我了解,Mnesia 的默认行为是在执行写操作之前在所有节点上同步获取锁。这将导致高延迟,尤其是对于地理分布的节点。

我的问题是:Mnesia 是否支持异步事务,仅在主节点上获取锁,然后将写入操作传播到从节点?

0 投票
2 回答
4074 浏览

ejabberd - ejabberd:用 mysql 替换 mnesia

有没有办法设置 mysql 来代替 mnesia。非常感谢您对此的任何帮助。对我来说一切都很顺利。我还需要存档历史文本。

提前感谢亚伯拉罕