本文以作者提供的example.erl为入口进行分析
地址 : https://github.com/devinus/poolboy
-module(example).
-behaviour(application).
-behaviour(supervisor).
-export([start/0, stop/0, squery/2, equery/3]).
-export([start/2, stop/1]).
-export([init/1]).
start() ->
application:start(?MODULE).
stop() ->
application:stop(?MODULE).
start(_Type, _Args) ->
supervisor:start_link({
local, example_sup}, ?MODULE, []).
stop(_State) ->
ok.
init([]) ->
{
ok, Pools} = application:get_env(example, pools),
PoolSpecs = lists:map(fun({
Name, SizeArgs, WorkerArgs}) ->
PoolArgs = [{
name, {
local, Name}},
{
worker_module, example_worker}] ++ SizeArgs,
poolboy:child_spec(Name, PoolArgs, WorkerArgs)
end, Pools),
{
ok, {
{
one_for_one, 10, 10}, PoolSpecs}}.
squery(PoolName, Sql) ->
poolboy:transaction(PoolName, fun(Worker) ->
gen_server:call(Worker, {
squery, Sql})
end).
equery(PoolName, Stmt, Params) ->
poolboy:transaction(PoolName, fun(Worker) ->
gen_server:call(Worker, {
equery, Stmt, Params})
end).
poolboy初始化分析
1.在这个demo中,在init中通过 poolboy:child_spec(Name, PoolArgs, WorkerArgs) 调用poolboy:start_link/2
child_spec(PoolId, PoolArgs, WorkerArgs) ->
{
PoolId, {
poolboy, start_link, [PoolArgs, WorkerArgs]},
permanent, 5000, worker, [poolboy]}.
2. 在poolboy:start_link/2中进一步调用gen_server:start_link/3,4
start_link(PoolArgs, WorkerArgs) ->
start_pool(start_link, PoolArgs, WorkerArgs).
start_pool(StartFun, PoolArgs, WorkerArgs) ->
case proplists:get_value(name, PoolArgs) of
undefined ->
gen_server:StartFun(?MODULE, {
PoolArgs, WorkerArgs}, []);
Name ->
gen_server:StartFun(Name, ?MODULE, {
PoolArgs, WorkerArgs