问题标签 [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.
functional-programming - 我应该采取多远的参考透明度?
我正在使用 erlang、mnesia 和 webmachine 构建一个网站。我读过的大多数文档都赞扬了具有引用透明功能的优点。
问题是,所有数据库访问都是外部状态。这意味着访问数据库的任何方法都不再是引用透明的。
假设我在数据库中有一个用户对象和一些处理身份验证的函数。
引用不透明函数可能如下所示:
引用透明性要求我尽量减少引用不透明代码的数量,因此调用者必须从数据库中获取对象并将其作为参数传递给函数:
上面的代码显然不是生产代码 - 它纯粹是为了说明目的而组成的。
我不想陷入教条。引用透明代码(如可证明的单元测试)的好处是否证明了不太友好的界面?在追求参照透明方面我应该走多远?
erlang - 节点之间的 Erlang Ets 表
我有一个运行大量自定义模块的 ejabberd 服务器。我有几个 mnesia 表,我知道这些表可以很容易地在节点之间复制,而无需对代码进行任何更改。我想知道ets表是否有类似的方法?
理想情况下,能够让多台机器运行完全相同的 mnesia 和 ets 数据会很好,而不必将我的 ets 表转换为 mnesia 表。(因此重写了大量的代码。)
虽然我曾经对每个节点的 ets 表执行 rpc:call,但我不确定这会对性能产生什么影响。
如果有人有任何答案,请告诉我。
database - Erlang:Mnesia:连续更新单个字段值
我有一个 mnesia 表,其中包含使用记录创建的三个字段 i、a 和 b
现在我在表中插入一行:
现在,如果我想更新这一行,并且只将 a 的值更改为 10,同时让 i 和 b 具有相同的值,我该怎么办?有没有类似“ UPDATE T SET a=10 WHERE i=1
”的SQL等价物?
如果我做这样的事情:
该行存储为:
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 返回的锁记录。该文档明确指出仅支持读锁。有其他选择吗?
更新: 我一直在尝试一些,我认为可能的解决方案是使用复合键。假设我将数据写入如下表:
有什么方法可以查找条目,使用不关心?
我尝试了这些,但都返回了空结果:
erlang - Erlang:为 mnesia 指定工作目录?
如何在mnesia
不通过命令行传递“dir”参数的情况下指定工作目录?
换句话说,我可以在调用 `mnesia:start()' 之前为 mnesia 指定一个“工作目录”吗?
erlang - Erlang:多次调用 mnesia:create_schema 的副作用?
mnesia:create_schema()
在每个应用程序启动时调用是否有副作用?
从我继续阅读的内容来看,每个数据库实例只应调用此函数一次。在现有数据库上多次调用它是一个大问题吗?
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 优化的“原因”。
erlang - Ejabberd 内存消耗(或泄漏?)
我在我们的服务器上使用 ejabberd + mochiweb。我让 ejabberd 和 mochiweb 运行的时间越长,消耗的内存就越多(昨晚它消耗了 35% 的内存。现在它有点高于 50%)。我认为这只是一个 mnesia 垃圾收集问题 - 所以我安装了 Erlang R13B3 并重新启动了 ejabberd。但这并没有解决它。
所以我现在注意到,在完全内存消耗的 50% 以上时,看起来 ejabberd 开始“释放”内存并保持在 50% 左右。这是正常的吗?约 50% 是 ejabberd 的阈值吗,所以当它达到它时,它会说,“嘿,是时候让一些内存消失了……”也许它会保留其余部分以便快速访问(比如缓存 mnesia?)
我很感激任何意见。谢谢!
erlang - Mnesia 异步事务
我想有一个 Erlang 节点的主从设置,其中读写操作只发生在主节点上。从节点仅保留为热备份。
据我了解,Mnesia 的默认行为是在执行写操作之前在所有节点上同步获取锁。这将导致高延迟,尤其是对于地理分布的节点。
我的问题是:Mnesia 是否支持异步事务,仅在主节点上获取锁,然后将写入操作传播到从节点?
ejabberd - ejabberd:用 mysql 替换 mnesia
有没有办法设置 mysql 来代替 mnesia。非常感谢您对此的任何帮助。对我来说一切都很顺利。我还需要存档历史文本。
提前感谢亚伯拉罕