{"id":13507139,"url":"https://github.com/devinus/poolboy","last_synced_at":"2025-05-14T00:06:16.526Z","repository":{"id":1158666,"uuid":"1046213","full_name":"devinus/poolboy","owner":"devinus","description":"A hunky Erlang worker pool factory","archived":false,"fork":false,"pushed_at":"2023-04-18T06:08:28.000Z","size":3339,"stargazers_count":1566,"open_issues_count":44,"forks_count":352,"subscribers_count":71,"default_branch":"master","last_synced_at":"2025-04-10T02:16:16.755Z","etag":null,"topics":["erlang","pool","worker-pool"],"latest_commit_sha":null,"homepage":"http://github.com/devinus/poolboy","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devinus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2010-11-02T22:13:46.000Z","updated_at":"2025-04-02T03:53:25.000Z","dependencies_parsed_at":"2023-07-06T22:01:22.135Z","dependency_job_id":null,"html_url":"https://github.com/devinus/poolboy","commit_stats":{"total_commits":177,"total_committers":35,"mean_commits":5.057142857142857,"dds":0.6271186440677966,"last_synced_commit":"9212a8770edb149ee7ca0bca353855e215f7cba5"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devinus%2Fpoolboy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devinus%2Fpoolboy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devinus%2Fpoolboy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devinus%2Fpoolboy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devinus","download_url":"https://codeload.github.com/devinus/poolboy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248142906,"owners_count":21054671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erlang","pool","worker-pool"],"created_at":"2024-08-01T02:00:24.910Z","updated_at":"2025-04-10T02:16:21.223Z","avatar_url":"https://github.com/devinus.png","language":"Erlang","readme":"# Poolboy - A hunky Erlang worker pool factory\n\n[![Build Status](https://api.travis-ci.org/devinus/poolboy.svg?branch=master)](https://travis-ci.org/devinus/poolboy)\n\n[![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.3.0/dist/gratipay.png)](https://gratipay.com/devinus/)\n\nPoolboy is a **lightweight**, **generic** pooling library for Erlang with a\nfocus on **simplicity**, **performance**, and **rock-solid** disaster recovery.\n\n## Usage\n\n```erl-sh\n1\u003e Worker = poolboy:checkout(PoolName).\n\u003c0.9001.0\u003e\n2\u003e gen_server:call(Worker, Request).\nok\n3\u003e poolboy:checkin(PoolName, Worker).\nok\n```\n\n## Example\n\nThis is an example application showcasing database connection pools using\nPoolboy and [epgsql](https://github.com/epgsql/epgsql).\n\n### example.app\n\n```erlang\n{application, example, [\n    {description, \"An example application\"},\n    {vsn, \"0.1\"},\n    {applications, [kernel, stdlib, sasl, crypto, ssl]},\n    {modules, [example, example_worker]},\n    {registered, [example]},\n    {mod, {example, []}},\n    {env, [\n        {pools, [\n            {pool1, [\n                {size, 10},\n                {max_overflow, 20}\n\t\t\t], [\n                {hostname, \"127.0.0.1\"},\n                {database, \"db1\"},\n                {username, \"db1\"},\n                {password, \"abc123\"}\n            ]},\n            {pool2, [\n                {size, 5},\n                {max_overflow, 10}\n\t\t\t], [\n                {hostname, \"127.0.0.1\"},\n                {database, \"db2\"},\n                {username, \"db2\"},\n                {password, \"abc123\"}\n            ]}\n        ]}\n    ]}\n]}.\n```\n\n### example.erl\n\n```erlang\n-module(example).\n-behaviour(application).\n-behaviour(supervisor).\n\n-export([start/0, stop/0, squery/2, equery/3]).\n-export([start/2, stop/1]).\n-export([init/1]).\n\nstart() -\u003e\n    application:start(?MODULE).\n\nstop() -\u003e\n    application:stop(?MODULE).\n\nstart(_Type, _Args) -\u003e\n    supervisor:start_link({local, example_sup}, ?MODULE, []).\n\nstop(_State) -\u003e\n    ok.\n\ninit([]) -\u003e\n    {ok, Pools} = application:get_env(example, pools),\n    PoolSpecs = lists:map(fun({Name, SizeArgs, WorkerArgs}) -\u003e\n        PoolArgs = [{name, {local, Name}},\n            \t\t{worker_module, example_worker}] ++ SizeArgs,\n        poolboy:child_spec(Name, PoolArgs, WorkerArgs)\n    end, Pools),\n    {ok, {{one_for_one, 10, 10}, PoolSpecs}}.\n\nsquery(PoolName, Sql) -\u003e\n    poolboy:transaction(PoolName, fun(Worker) -\u003e\n        gen_server:call(Worker, {squery, Sql})\n    end).\n\nequery(PoolName, Stmt, Params) -\u003e\n    poolboy:transaction(PoolName, fun(Worker) -\u003e\n        gen_server:call(Worker, {equery, Stmt, Params})\n    end).\n```\n\n### example_worker.erl\n\n```erlang\n-module(example_worker).\n-behaviour(gen_server).\n-behaviour(poolboy_worker).\n\n-export([start_link/1]).\n-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,\n         code_change/3]).\n\n-record(state, {conn}).\n\nstart_link(Args) -\u003e\n    gen_server:start_link(?MODULE, Args, []).\n\ninit(Args) -\u003e\n    process_flag(trap_exit, true),\n    Hostname = proplists:get_value(hostname, Args),\n    Database = proplists:get_value(database, Args),\n    Username = proplists:get_value(username, Args),\n    Password = proplists:get_value(password, Args),\n    {ok, Conn} = epgsql:connect(Hostname, Username, Password, [\n        {database, Database}\n    ]),\n    {ok, #state{conn=Conn}}.\n\nhandle_call({squery, Sql}, _From, #state{conn=Conn}=State) -\u003e\n    {reply, epgsql:squery(Conn, Sql), State};\nhandle_call({equery, Stmt, Params}, _From, #state{conn=Conn}=State) -\u003e\n    {reply, epgsql:equery(Conn, Stmt, Params), State};\nhandle_call(_Request, _From, State) -\u003e\n    {reply, ok, State}.\n\nhandle_cast(_Msg, State) -\u003e\n    {noreply, State}.\n\nhandle_info(_Info, State) -\u003e\n    {noreply, State}.\n\nterminate(_Reason, #state{conn=Conn}) -\u003e\n    ok = epgsql:close(Conn),\n    ok.\n\ncode_change(_OldVsn, State, _Extra) -\u003e\n    {ok, State}.\n```\n\n## Options\n\n- `name`: the pool name\n- `worker_module`: the module that represents the workers\n- `size`: maximum pool size\n- `max_overflow`: maximum number of workers created if pool is empty\n- `strategy`: `lifo` or `fifo`, determines whether checked in workers should be\n  placed first or last in the line of available workers. So, `lifo` operates like a traditional stack; `fifo` like a queue. Default is `lifo`.\n\n## Authors\n\n- Devin Torres (devinus) \u003cdevin@devintorres.com\u003e\n- Andrew Thompson (Vagabond) \u003candrew@hijacked.us\u003e\n- Kurt Williams (onkel-dirtus) \u003ckurt.r.williams@gmail.com\u003e\n\n## License\n\nPoolboy is available in the public domain (see `UNLICENSE`).\nPoolboy is also optionally available under the ISC license (see `LICENSE`),\nmeant especially for jurisdictions that do not recognize public domain works.\n","funding_links":[],"categories":["Actors","Erlang","Libraries"],"sub_categories":["Concurrency"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevinus%2Fpoolboy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevinus%2Fpoolboy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevinus%2Fpoolboy/lists"}