Где запустить пулбой в частном порядке?erlang базы данных пулов соединений
Use the ,请见谅!!!! Я использую Poolboy в качестве пулов соединений с базой данных, я прочитал README.md на github: https://github.com/devinus/poolboy Но, наконец, я не знаю, где я запустил пулбоя, когда хочу, чтобы он запустился, а затем я получил ошибку: уже
Файлы моего проекта: http://pastebin.com/zus6dGdz Я использую ковбоя, чтобы быть моим http-сервером, но вы можете проигнорировать его.
Я запускаю программу следующим образом: 1. Я использую арматуру для компиляции $rebar clean & make 2. Затем я использую erl для запуска своей программы $ erl -pa ebin/ -pa deps/*/ebin -s start server_start Но я получил ошибки следующим образом:
=CRASH REPORT==== 3-Feb-2015::17:47:27 ===
crasher:
initial call: poolboy:init/1
pid: <0.171.0>
registered_name: []
exception exit: {{badmatch,{error,{already_started,<0.173.0>}}},
[{poolboy,new_worker,1,
[{file,"src/poolboy.erl"},{line,260}]},
{poolboy,prepopulate,3,
[{file,"src/poolboy.erl"},{line,281}]},
{poolboy,init,3,[{file,"src/poolboy.erl"},{line,143}]},
{gen_server,init_it,6,
[{file,"gen_server.erl"},{line,306}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,237}]}]}
in function gen_server:init_it/6 (gen_server.erl, line 330)
ancestors: [hello_erlang_sup,<0.66.0>]
messages: []
links: [<0.172.0>,<0.173.0>,<0.170.0>]
dictionary: []
trap_exit: true
status: running
heap_size: 610
stack_size: 27
reductions: 205
neighbours:
neighbour: [{pid,<0.173.0>},
{registered_name,db_mongo_handler},
{initial_call,{db_mongo_handler,init,['Argument__1']}},
{current_function,{gen_server,loop,6}},
{ancestors,[<0.172.0>,mg_pool1,hello_erlang_sup,<0.66.0>]},
{messages,[]},
{links,[<0.172.0>,<0.174.0>,<0.171.0>]},
{dictionary,[]},
{trap_exit,false},
{status,waiting},
{heap_size,233},
{stack_size,9},
{reductions,86}]
Пожалуйста, помогите решить проблему!
1 ответ
Вы создаете пул из 10 работников с таким же зарегистрированным именем. Когда процесс зарегистрирован под именем и другой процесс пытается зарегистрироваться под тем же именем, вы получаете сообщение об ошибке already_started
,
В вашем примере кода рабочим модулем для poolboy является db_mongo_handler. Poolboy пытается запустить 10 рабочих, позвонив db_mongo_handler:start_link/1
который реализован как
start_link(Args) ->
gen_server:start_link({local, ?SERVER}, ?MODULE, Args, []).
Первый рабочий может начать, но когда второй рабочий запускается, он падает с already_started
,
Обычно работники пула из многих подобных работников не должны иметь зарегистрированного имени. Вместо этого, только у пула есть имя, и когда вам нужен работник, вы просите poolboy предоставить pid()
одного из работников, использующих poolboy:checkout(mg_pool1)
,
Чтобы исправить код, измените gen_server:start_link({local, ?SERVER}, ?MODULE, Args, [])
в gen_server:start_link(?MODULE, Args, [])
, Тогда он не будет зарегистрирован под именем.