ublog

n2o - чіпляємо до нашого додатку epgsql_pool

programming [33]erlang [32]n2o [17]postgresql [9]

Вітаю!

раніше ми уже трішки розглядали як в erlang та n2o працювати з postgresql
https://blog.clever-games.win/post/6

продовжуємо -

зараз ми розглянемо розглянемо як причепити до нашого 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
( https://blog.clever-games.win/post/19 )

і на завершення -- видалимо звідусюди наступне :
Mpid = pg:mypg()

epgsql:close(Mpid)

Mpid


зверніть увагу на транзації --
будь-яке виключення, котре виникне всередині транзакції -- для прикладу, throw(cancel_transaction) -- відміняє транзакцію

комміт -- https://github.com/221V/ublog/commit/6d748a6506b9b5e4d16dfeaa90880b00c433356e


Далі буде)