Erlang mnesia(一) 生成sequence 查错过程
来源:互联网 发布:ubuntu吧 编辑:程序博客网 时间:2024/06/04 23:36
整了段代码,想用mnesia数据库来实现类似于Oracle中sequence 的功能。
原代码如下:
%% Author: Administrator%% Created: 2012-2-16%% Description: TODO: Add description to id_generator-module(id_generator).-behavior(gen_server).%%%% Include files%%%%%% Exported Functions%%-export([start_link/0,getnewid/1]).-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]).-record(ids,{idtype,ids}).-record(state,{}).%%%% API Functions%%start_link()->gen_server:start_link({local,?MODULE}, ?MODULE, [],[]).init([])->mnesia:start(),io:format("Started"),mnesia:create_schema([node()]),case mnesia:create_table(ids,[{type,ordered_set}, {attributes,record_info(fields,ids)}, {disc_copies,[]} ]) of{atomic,ok}->{atomic,ok};{error,Reason}->io:format("create table error")end,{ok,#state{}}.getnewid(IdType)->io:format("waiting ~n"),%case mnesia:wait_for_tables([tbl_clientid], 5000) of%ok->%gen_server:call(?MODULE, {getid,IdType});%{timeout,_BadList}->%{timeout,_BadList};%{error,Reason}->%{error,Reason}%end mnesia:force_load_table(ids),gen_server:call(?MODULE, {getid,IdType}).%%generate new Id with given typehandle_call({getid,IdType},From,State)->F=fun()->Result=mnesia:read(ids,IdType,write),case Result of[S]->io:format("have ~n"),Id=S#ids.ids,NewClumn=S#ids{ids=Id+1},mnesia:write(ids,NewClumn,write),Id;[]->io:format("none ~n"),NewClumn=#ids{idtype=IdType,ids=2},mnesia:write(ids,NewClumn,write),1end end, case mnesia:transaction(F)of {atomic,Id}-> {atomic,Id}; {aborted,Reason}-> io:format("run transaction error ~1000.p ~n",[Reason]), Id=0; _Els-> Id=1000 end, {reply,Id,State}.handle_cast(_From,State)->ok.handle_info(_From,State)->ok.terminate(_From,State)->ok.code_change(_OldVer,State,Ext)->{ok,State}.%%%% Local Functions%%
使用方法:
id_generator:start_link().
id_generator:getnewid(aaa).
总结:
1.要注意将mnsia创建表时的参数写对
2.直接将表的列定义为一个record ,并且第二个字段与表同名
3.表未创建成功,或者有问题时mnesia:wait_for_tables 会超时,最好不要用mnesia:wait_for_tables([mytable],infinity),一旦出错快速结束很重要
4.针对可能异常的地方多判断,做好异常处理
- Erlang mnesia(一) 生成sequence 查错过程
- erlang mnesia
- erlang mnesia
- erlang的mnesia总结
- erlang的mnesia
- [Erlang]Mnesia分布式应用
- [Erlang]Mnesia常用技巧
- Erlang数据库Mnesia操作
- erlang mnesia 分布式应用
- erlang mnesia 遍历
- Erlang 之 Mnesia error
- erlang mnesia集群建立
- Mnesia(一)
- 最近研究Erlang的mnesia
- 如何使用erlang mnesia 数据库
- erlang mnesia表的遍历
- erlang mnesia 常用使用技巧
- [Erlang]Mnesia模拟mysql操作
- 中山大学 1238: 兵临城下//优先队列
- C# Implementation-of-Mime-De-encode
- C++指向类成员函数的指针
- 再学C++ Primer(2)-变量与基本类型
- Linux多线程编程
- Erlang mnesia(一) 生成sequence 查错过程
- 简单网络协议SNMP之net-snmp开发snmpget
- 超实用的Android手机指令大全
- DOM Node的基本属性在各个浏览器下的区别
- Android onSaveInstanceState和onRestoreInstanceState触发的时机
- the year of big data一些入门
- 微软一站式示例代码库(中文版)2012-2-10版本, 新添加ASP.NET, Windows Form, VSX, Windows Shell, WPF等16个Sample
- 九度OJ 1149:子串计算 暴力枚举
- 只允许输入数字的JS代码