erlang学习: Mnesia Erlang数据库4

表的类型和位置

内存表
它们的速度非常快,但是里面的数据是易失的,所以如果机器崩溃或者你停止了DBMS,数据就会丢失。

磁盘表
磁盘表应该不会受到系统崩溃的影响(前提是磁盘没有物理损坏)。
当Mnesia事务写入一个表并且这个表是保存在磁盘上时,实际上是事务数据首先被写入
了一个磁盘日志。这个磁盘日志会不断增长,里面的信息会每隔一段时间与数据库里的其他数据合并,然后磁盘日志里的条目就会被清除。如果系统崩溃了,磁盘日志就会在下一次系统重启时进行一致性检查,任何未合并的日志条目会先添加到数据库里,然后数据库才可用。
任何一个事务成功时,数据都应该已经正确写入到磁盘日志里,如果系统随后崩溃了,那么当它下次重启时,事务所做的改动应该会完好无损。
如果系统在事务进行过程中崩溃了,那么它对数据库所做的改动应该会丢失。
使用内存表之前,需要做一些试验来看看物理内存是否能容纳整个表。如果物理内存装不下内存表,系统就会频繁读写页面文件,这将会影响性能。
内存表是易失的,所以如果想构建一个容错式应用程序,就需要把内存表复制到磁盘上,或者把它复制为第二台机器的内存或磁盘表,或者两者皆有。

常见的表属性组合

mnesia:create_table(shop, [Attrs]).

它会在单个节点上创建一个常驻内存的表。
如果节点崩溃了,表就会丢失。
它是所有表里最快的一种。
内存必须能容纳这个表。

mnesia:create_table(shop,[Attrs,{disc_copies,[node()]}]).

它会在单个节点上创建一个常驻内存的表和一个磁盘副本。
如果节点崩溃了,表就会从磁盘恢复。
表的读访问很快,但写访问较慢。
内存最好能容纳这个表。

mnesia:create_table(shop,[Attrs,{disc_only_copies,[node()]}]).

它只会在单个节点上创建一个磁盘副本。
它用于那些因为太大而无法放入内存的表。
它的访问速度比带有内存副本的方案更慢。

mnesia:create_table(shop,[Attrs,{ram_copies,[node(),someOthernode()]}]).

它会在两个节点上各创建一个常驻内存的表。
如果两个节点都崩溃了,表就会丢失。
内存必须能容纳这个表。
可以在任何一个节点上访问这个表。

mnesia:create_table(shop,[Attrs,{disc_copies,[node()],someOthernode()}]).

它会在多个节点上创建磁盘副本。
无论哪个节点崩溃,我们都能恢复过来。
即使所有节点都崩溃了,表也不会丢失。

代码片段

在上次的代码中补充test即可,其中Attr格式如下所示即可创建相应数据库表

test() ->
  Attrs = {attributes, record_info(fields, shop)},
  mnesia:create_table(shop,[Attrs]).
%%  mnesia:create_table(shop,[Attrs,{disc_copies,[node()]}]),
%%  mnesia:create_table(shop,[Attrs,{disc_only_copies,[node()]}]).
%%  mnesia:create_table(shop,[Attrs,{ram_copies,[node(),some_node]}]),
%%  mnesia:create_table(shop,[Attrs,{disc_copies,[node()],some_node}]).

下面是运行截图,当时没有启动数据库,因此报了节点没有运行的错误,之后使用test函数创建数据库。由于我之前已经创建过了,这里说我已经创建了shop数据库,说明是可以创建成功的。
请添加图片描述

Mnesia数据库的学习基本上就差不多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值