Где запустить пулбой в частном порядке?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, []), Тогда он не будет зарегистрирован под именем.

Другие вопросы по тегам