Mnesia的分布式
December 18th, 2008 :: Godwit
Mnesia的分布式如何使用呢?做了个简单的测试:
代码如下:
- -module( db ).
- -compile( export_all ).
- -include_lib( "stdlib/include/qlc.hrl" ).
- -include_lib( "eunit/include/eunit.hrl" ).
- %% player
- -record( player, {
- oid, %% object id
- username
- } ).
- table_data() ->
- [ %% The player table
- { player, 1, "david1" },
- { player, 2, "david2" },
- { player, 3, "david3" },
- { player, 4, "david4" },
- { player, 5, "david5" }
- ].
- set_table_data() ->
- mnesia:clear_table( player ),
- F = fun() ->
- lists:foreach( fun mnesia:write/1, table_data() )
- end,
- mnesia:transaction( F ).
- install( Nodes ) when is_list( Nodes ) ->
- mnesia:stop(),
- mnesia:delete_schema( Nodes ),
- catch ( mnesia:create_schema( Nodes ) ),
- mnesia:start(),
- case mnesia:create_table ( player, [
- { disc_copies, Nodes },
- { type, set },
- { attributes, record_info( fields, player ) }
- ] ) of
- { atomic, ok } ->
- ok;
- _Any ->
- io:format( "create table error!~n")
- end,
- ok.
- do( Q ) ->
- F = fun() -> qlc:e( Q ) end,
- { atomic, Val } = mnesia:transaction( F ),
- Val.
- demo( select_player ) ->
- do( qlc:q([ X || X
- mnesia:start(),
- set_table_data(),
- mnesia:stop().
俺用的是windows系统,在控制台下:
erl -sname a
Eshell V5.6.3 (abort with ^G)
(a@godwit)1> db:install( [node()] ).
ok
(a@godwit)2> db:init().
stopped
=INFO REPORT==== 18-Dec-2008::22:42:54 ===
application: mnesia
exited: stopped
type: temporary
(a@godwit)4> mnesia:start().
ok
(a@godwit)5> tv:start(). %% 这里你可以看到数据库内容。
Eshell V5.6.3 (abort with ^G)
(a@godwit)1> db:install( [node()] ).
ok
(a@godwit)2> db:init().
stopped
=INFO REPORT==== 18-Dec-2008::22:42:54 ===
application: mnesia
exited: stopped
type: temporary
(a@godwit)4> mnesia:start().
ok
(a@godwit)5> tv:start(). %% 这里你可以看到数据库内容。
然后在另一个控制台下:
erl -sname b -mnesia extra_db_nodes [a@godwit]
Eshell V5.6.3 (abort with ^G)
(b@godwit)1> mnesia:start().
ok
(b@godwit)2> tv:start(). %% 查看数据库内容,已经拷贝过来了!!!
Eshell V5.6.3 (abort with ^G)
(b@godwit)1> mnesia:start().
ok
(b@godwit)2> tv:start(). %% 查看数据库内容,已经拷贝过来了!!!
Bingo!一般人我不告诉他!
PS:博主,我不知道我贴这么幼稚的文章行不行?:)
mnesia的资料本来就少, 谢谢提供!
美化了一下 code ,看来你没有用 plain editor 。:P
PS. 群博客没博主,只有一个义务扫水员。只要跟 erlang 有关,贴啥都行。
支持樓主! 感謝分享,目前mnesia的資料只能看官方英文文檔,有這樣的例子對大家都是好事啊。
谢谢楼主的奉献哦,不过最后的一个函数
demo( select_player ) ->
do( qlc:q([ X || X
mnesia:start(),
set_table_data(),
mnesia:stop().
是不是粘贴的时候少了? 这个demo函数没有结束呀?
楼主补上?谢谢了哦