Знайомство з n2o v4.4 [9]
Розглянемо як причепити до нашого erlang n2o-додатку epgsql_pool
раніше ми уже трішки розглядали як в erlang та n2o працювати з postgresql
продовжуємо -
зараз ми розглянемо розглянемо як причепити до нашого erlang n2o-додатку epgsql_pool
https://github.com/wgnet/epgsql_pool
до речі, цю бібліотеку написав той же програміст, який є автором https://github.com/yzh44yzh/practical_erlang
відповім на запитання, яке напевно уже у вас появилось:
"навіщо нам epgsql_pool, і що це таке взагалі?"
epgsql_pool -- це ерланг-пул з'єднань для ерланг-драйвера epgsql, який в свою чергу працює з СУБД postgresql
пул потрібний для того щоб ефективніше використовувати ресурси --
для прикладу у нас 100 користувачів на сайті,
кожен користувач відкриває з'єднання з субд, отримує дані, закриває з'єднання
тобто більшість часу йде на відкриття та закриття, не на користування
у випадку використання пула -- активних з'єднань буде всього 10, не 100
тобто тримаються постійними 10 з'єднань, а не створили-покористувались-закрили 100
крім цього, існує ще один корисний бонус при використанні пула --
раніше наш додаток міг "обвалитись" у випадку недоступності СУБД
(для прикладу коли postgresql перезавантажувалась),
зараз -- при використанні epgsql_pool -- додаток "падати" не буде
отже, що потрібно щоб причепити epgsql_pool до додатку,
де уже використовується epgsql:
пропишемо в rebar.config нашого додатку наступне
( пишу посилання на свої форки, я там деякі дрібниці поправив )
{pooler, ".*", {git, "https://github.com/221V/pooler.git", {tag, "master"} }},
{herd, ".*", {git, "https://github.com/wgnet/herd", {tag, "1.3.3"} }},
{epgsql_pool, ".*", {git, "https://github.com/221V/epgsql_pool", {tag, "master"} }}
додамо деякі налаштування по-замовчуванню в sys.config
{epgsql_pool,
[{connection_timeout, 10000},
{query_timeout, 3000},
{transaction_timeout, 10000} ]}
запускатимемо наш пул з gen_server, приблизно так як ми це робили раніше -- модулі ublog та pg
і на завершення -- видалимо звідусюди наступне:
Mpid = pg:mypg()
epgsql:close(Mpid)
Mpid
зверніть увагу на транзації --
будь-яке виключення, котре виникне всередині транзакції --
для прикладу, throw(cancel_transaction) -- відміняє транзакцію
комміт -- https://github.com/221V/ublog/commit/6d748a6506b9b5e4d16dfeaa90880b00c433356e
Посилання
https://github.com/wgnet/epgsql_pool
https://github.com/epgsql/epgsql