Home > study > Mnesia的分布式

Mnesia的分布式

December 18th, 2008 :: Godwit

Mnesia的分布式如何使用呢?做了个简单的测试:
代码如下:

  1. -module( db ).
  2. -compile( export_all ).
  3. -include_lib( "stdlib/include/qlc.hrl" ).
  4. -include_lib( "eunit/include/eunit.hrl" ).
  5.  
  6. %% player
  7. -record( player, {
  8. oid,        %% object id
  9. username
  10. } ).
  11.  
  12. table_data() ->
  13. [ %% The player table
  14. { player, 1, "david1" },
  15. { player, 2, "david2" },
  16. { player, 3, "david3" },
  17. { player, 4, "david4" },
  18. { player, 5, "david5" }
  19. ].
  20.  
  21. set_table_data() ->
  22. mnesia:clear_table( player ),
  23. F = fun() ->
  24. lists:foreach( fun mnesia:write/1, table_data() )
  25. end,
  26. mnesia:transaction( F ).
  27.  
  28. install( Nodes ) when is_list( Nodes ) ->
  29. mnesia:stop(),
  30. mnesia:delete_schema( Nodes ),
  31. catch ( mnesia:create_schema( Nodes ) ),
  32. mnesia:start(),
  33. case mnesia:create_table ( player, [
  34. { disc_copies, Nodes },
  35. { type, set },
  36. { attributes, record_info( fields, player ) }
  37. ] ) of
  38. { atomic, ok } ->
  39. ok;
  40. _Any ->
  41. io:format( "create table error!~n")
  42. end,
  43. ok.
  44.  
  45. do( Q ) ->
  46. F = fun() -> qlc:e( Q ) end,
  47. { atomic, Val } = mnesia:transaction( F ),
  48. Val.
  49.  
  50. demo( select_player ) ->
  51. do( qlc:q([ X || X
  52. mnesia:start(),
  53. set_table_data(),
  54. 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().   %% 这里你可以看到数据库内容。

然后在另一个控制台下:

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(). %% 查看数据库内容,已经拷贝过来了!!!

Bingo!一般人我不告诉他!
PS:博主,我不知道我贴这么幼稚的文章行不行?:)

study

  1. sw2wolf
    December 19th, 2008 at 14:02 | #1

    mnesia的资料本来就少, 谢谢提供!

  2. jackyz
    December 20th, 2008 at 11:10 | #2

    美化了一下 code ,看来你没有用 plain editor 。:P
    PS. 群博客没博主,只有一个义务扫水员。只要跟 erlang 有关,贴啥都行。

  3. January 12th, 2009 at 18:39 | #3

    支持樓主! 感謝分享,目前mnesia的資料只能看官方英文文檔,有這樣的例子對大家都是好事啊。

  4. cpusoft
    January 31st, 2009 at 22:10 | #4

    谢谢楼主的奉献哦,不过最后的一个函数
    demo( select_player ) ->
    do( qlc:q([ X || X
    mnesia:start(),
    set_table_data(),
    mnesia:stop().

    是不是粘贴的时候少了? 这个demo函数没有结束呀?
    楼主补上?谢谢了哦

  1. No trackbacks yet.