Знайомство з 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