<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: DBI постоянное соединение</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html</link>
    <description>Здравствуйте!&lt;br&gt;&lt;br&gt;есть код из скрипта, который один раз в 5 секунд вставляет строку в базу&lt;br&gt;база находится на другом конце openvpn туннеля&lt;br&gt;&lt;br&gt;my $dbh = DBI-&amp;gt;connect(&quot;dbi:Pg:dbname=db_exp;host=192.168.170.1;port=5432&quot;,&lt;br&gt;&quot;exp&quot;, &quot;111&quot;,&lt;br&gt;&#123;AutoCommit =&amp;gt; 0, RaiseError =&amp;gt; 0, PrintError =&amp;gt; 0, pg_enable_utf8 =&amp;gt; 1, ShowErrorStatement =&amp;gt; 1, InactiveDestroy =&amp;gt; 1&#125;);&lt;br&gt;my $query = qq/INSERT INTO proba_connector (id, name, is_del) VALUES (?,?,?)/;&lt;br&gt;my $sth = $dbh-&amp;gt;prepare($query);&lt;br&gt;while (1) &#123;&lt;br&gt;    my $rv = $sth-&amp;gt;execute(22, &apos;test&apos;, 1);&lt;br&gt;    print &quot;sleep 5&#092;n&quot;;&lt;br&gt;    sleep 5;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;при падении туннеля, скрипт как бы &quot;замирает&quot; на шаге &quot;sleep 5&quot;&lt;br&gt;и не переходит к вставке следующей строки, где можно было бы отловить падение канала&lt;br&gt;т.к. драйвер бы выдал ошибку, что мол нет коннекта&lt;br&gt;вопрос&lt;br&gt;можно ли как-то в скрипте отловить падение туннеля?&lt;br&gt;&lt;br&gt;после восстановления туннеля, скрипт &quot;оживает&quot; и продолжает свою работу.&lt;br&gt;У DBI есть метод ping, который как раз и предназначен решать эту проблему&lt;br&gt;и он прекрасно работает если ба</description>

<item>
    <title>DBI постоянное соединение (krpsh)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#9</link>
    <pubDate>Tue, 07 Jun 2016 06:37:47 GMT</pubDate>
    <description>В общем, поизучав сложившуюся ситуацию пришел в выводу, что использовать таймауты на каждый запрос - это плохо.&lt;br&gt;В интернете по запросу &quot;postgresql обрыв связи&quot; много интересных споров на эту тему.&lt;br&gt;Общий вывод из этих споров таков - нет однозначного ответа.&lt;br&gt;Наткнулся на интересное решение - форкнуть процесс от скрипта, который устанавливает свой коннект к базе. Этот форкнутый процесс занимается проверкой связи и если связь разорвалась, то шлет сигнал основному скрипту.&lt;br&gt;Такой вариант мне подходит :-)&lt;br&gt;</description>
</item>

<item>
    <title>DBI постоянное соединение (krpsh)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#8</link>
    <pubDate>Mon, 06 Jun 2016 09:52:16 GMT</pubDate>
    <description>&amp;gt; наверное не &quot;while (1) &quot; а &quot;while ($connect_db)&quot; &lt;br&gt;&amp;gt; потом, если все таки &quot;while (1)&quot; (что вообще говоря порочно в данном &lt;br&gt;&amp;gt; случае) &lt;br&gt;&amp;gt; то первой строкой цикла должна быть проверка на $connect_db и выход из &lt;br&gt;&amp;gt; цикла если не успешна..&lt;br&gt;&amp;gt; Ну и наконец... вы отошли от атомарных операций в своем скрипте.&lt;br&gt;&amp;gt; Почему вы не хотите устанавливать соединение каждый раз при необходимости записи?&lt;br&gt;&amp;gt; создали соединение - записали-вышли.&lt;br&gt;&amp;gt; Через 5 секунд повторили итерацию.&lt;br&gt;&lt;br&gt;если Вы говорите про полный скрипт из пятого сообщения то:&lt;br&gt;1)там в цикле while ($while_is_enabled), а $while_is_enabled - это как раз и есть условие выхода из цикла, просто я не писал условия установки его в 0 (там много всего).&lt;br&gt;2)первой строкой цикла и есть $dbh = check_connect_db($dbh);&lt;br&gt;идет проверка доступности соединения, и если оно не доступно, то $connect_db, до тех пор&lt;br&gt;пока не подлючится&lt;br&gt;3)на самом деле установка соединения перед каждой итерацией не решит проблему глобально&lt;br&gt;ведь проблема в том, что $dbh-&amp;gt;ping, не возвращает false при</description>
</item>

<item>
    <title>DBI постоянное соединение (Square1)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#7</link>
    <pubDate>Mon, 06 Jun 2016 09:15:27 GMT</pubDate>
    <description>наверное не &quot;while (1) &quot; а &quot;while ($connect_db)&quot;&lt;br&gt;потом, если все таки &quot;while (1)&quot; (что вообще говоря порочно в данном случае)&lt;br&gt;то первой строкой цикла должна быть проверка на $connect_db и выход из цикла если не успешна..&lt;br&gt;&lt;br&gt;Ну и наконец... вы отошли от атомарных операций в своем скрипте.&lt;br&gt;Почему вы не хотите устанавливать соединение каждый раз при необходимости записи?&lt;br&gt;создали соединение - записали-вышли.&lt;br&gt;Через 5 секунд повторили итерацию.&lt;br&gt;</description>
</item>

<item>
    <title>DBI постоянное соединение (krpsh)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#6</link>
    <pubDate>Mon, 06 Jun 2016 07:04:24 GMT</pubDate>
    <description>&amp;gt; 1) как вы собираетесь обрабатывать падение канала - какие действия будете предпринимать? &lt;br&gt;&amp;gt; У вас же &quot;бесконечная транзакция&quot; которая по падению сеанса будет отменена &lt;br&gt;&amp;gt; на сервере.&lt;br&gt;&amp;gt; Если у вас между вставками 5 секунд, то может и нет смысла &lt;br&gt;&amp;gt; в &quot;бесконечной транзакции&quot;?&lt;br&gt;&lt;br&gt;Да согласен, &quot;бесконечная транзакция&quot; забыл при написании в посте сменить AutoCommit =&amp;gt; 1&lt;br&gt;Полный скрипт выложил в 5 ответе.&lt;br&gt;Обрабатывать падение - нужны попытки реконнекта к базе, так долго, пока канал не поднимется.&lt;br&gt;А если смотреть дальше то, скрипт выполняет много последовательных действий с базой.&lt;br&gt;Приведенный скрипт лишь выполняет одно действие (вставляет строку, пусть и бесконечно, но в реальном скрипте есть условие выхода из цикла вставки).&lt;br&gt;И нужно сделать так - не переходить к другому действию, если канал упал, а скрипт просто &quot;замирает&quot; при падении канала.&lt;br&gt;Я понимаю, что при падении канала, когда скрипт замер, он не перейдет к другому действию, но нужно этот момент отловить, чтобы послать письмо админу, что мол у тебя к</description>
</item>

<item>
    <title>DBI постоянное соединение (krpsh)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#5</link>
    <pubDate>Mon, 06 Jun 2016 06:40:34 GMT</pubDate>
    <description>&amp;gt; Замостите полную версию скрипта. С проверкой ping.&lt;br&gt;&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;package Testov_test;&lt;br&gt;&lt;br&gt;use strict;&lt;br&gt;use warnings;&lt;br&gt;use utf8;&lt;br&gt;use open qw(:std :utf8);&lt;br&gt;use FindBin;&lt;br&gt;use lib $FindBin::Bin;&lt;br&gt;use DBI;&lt;br&gt;&lt;br&gt;my $con_errstr = undef;&lt;br&gt;my $while_is_enabled = 1;&lt;br&gt;&lt;br&gt;&lt;br&gt;sub connect_db &#123;&lt;br&gt;# connect db&lt;br&gt;my $dbh = DBI-&amp;gt;connect(&quot;dbi:Pg:dbname=db_exp;host=192.168.170.1;port=5432&quot;,&lt;br&gt;&quot;exp&quot;, &quot;111&quot;,&lt;br&gt;&#123;AutoCommit =&amp;gt; 0, RaiseError =&amp;gt; 0, PrintError =&amp;gt; 0, pg_enable_utf8 =&amp;gt; 1, ShowErrorStatement =&amp;gt; 1, InactiveDestroy =&amp;gt; 1&#125;);&lt;br&gt;&lt;br&gt;unless ($dbh) &#123;&lt;br&gt;$con_errstr = &quot;cannot connect on database ($DBI::errstr)&quot;;&lt;br&gt;return undef;&lt;br&gt;&#125; else &#123;&lt;br&gt;return $dbh;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;sub check_connect_db &#123;&lt;br&gt;my $dbh = shift;&lt;br&gt;&lt;br&gt;print &quot;=============check conn db============&#092;n&quot;;&lt;br&gt;my $conn_db = 0;&lt;br&gt;#print &quot;ping=&quot;.$dbh-&amp;gt;ping.&quot;&#092;n&quot;;&lt;br&gt;unless ($dbh-&amp;gt;ping) &#123;&lt;br&gt;$dbh = undef;&lt;br&gt;$conn_db = 1;&lt;br&gt;&#125;&lt;br&gt;while ($conn_db) &#123;&lt;br&gt;print &quot;lost connect to db, attempt restore the connection (interval 10sec)&#092;n&quot;;&lt;br&gt;$dbh = connect_db;&lt;br&gt;if ($dbh) &#123;&lt;br&gt;print </description>
</item>

<item>
    <title>DBI постоянное соединение (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#4</link>
    <pubDate>Mon, 06 Jun 2016 06:32:12 GMT</pubDate>
    <description>1) как вы собираетесь обрабатывать падение канала - какие действия будете предпринимать? У вас же &quot;бесконечная транзакция&quot; которая по падению сеанса будет отменена на сервере.&lt;br&gt;Если у вас между вставками 5 секунд, то может и нет смысла в &quot;бесконечной транзакции&quot;?&lt;br&gt;&lt;br&gt;2) еще есть метод ping у openvpn. Мне кажется, это будет предпочтительный для вас вариант, не отменяющий, конечно, п.1.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>DBI постоянное соединение (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#3</link>
    <pubDate>Mon, 06 Jun 2016 06:10:33 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; Я полагал, что когда я отрублю канал, скрипт при последующей итерации попытается &lt;br&gt;&amp;gt; вставить &lt;br&gt;&amp;gt; строку в базу, но он даже не пытается - вот это и &lt;br&gt;&amp;gt; напрягает. Почему так происходит?&lt;br&gt;&amp;gt; В реальном скрипте есть куча проверок на коннект перед выполнением запросов &lt;br&gt;&amp;gt; и даже есть реконнект при не доступности базы (метод ping у DBI). &lt;br&gt;&amp;gt; Но я не мгу проверить доступность базы если канал упал. Скрипт просто &lt;br&gt;&amp;gt; &quot;замирает&quot; &lt;br&gt;&amp;gt; и не переходит к следующей итерации цикла while, чтобы я мог проверить &lt;br&gt;&amp;gt; коннект.&lt;br&gt;&lt;br&gt;Замостите полную версию скрипта. С проверкой ping.&lt;br&gt;&lt;br&gt;&amp;gt; не ужели мне надо оборачивать все действия с базой в сигнал ALRM &lt;br&gt;&amp;gt; судя по этому топику - придется http://www.opennet.ru/openforum/vsluhforumID9/6774.html &lt;br&gt;&amp;gt; блин, а если я не угадаю с таймаутом (вдруг запрос будет выполняться &lt;br&gt;&amp;gt; дольше обычного, да и запросы разные, один - 1сек, другой 25 &lt;br&gt;&amp;gt; сек) </description>
</item>

<item>
    <title>DBI постоянное соединение (krpsh)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#2</link>
    <pubDate>Sun, 05 Jun 2016 18:59:32 GMT</pubDate>
    <description>&amp;gt; Может, стоит просто делать проверку доступности удаленного хоста с базой перед тем &lt;br&gt;&amp;gt; как начинать писать в неё? В DBI ещё timeout есть, погуглите. &lt;br&gt;&lt;br&gt;Это все понятно, код который я привел - тестовый.&lt;br&gt;Т.е. я поднимаю канал, запускаю скрипт, жду когда скрипт вставить пару строк,&lt;br&gt;затем рву канал и скрипт, бац и замер, и висит до поднятия канала (я ждал 10 мин),&lt;br&gt;как только канал поднялся снова, скрипт продолжает вставлять строки.&lt;br&gt;Я полагал, что когда я отрублю канал, скрипт при последующей итерации попытается вставить&lt;br&gt;строку в базу, но он даже не пытается - вот это и напрягает. Почему так происходит?&lt;br&gt;В реальном скрипте есть куча проверок на коннект перед выполнением запросов&lt;br&gt;и даже есть реконнект при не доступности базы (метод ping у DBI).&lt;br&gt;Но я не мгу проверить доступность базы если канал упал. Скрипт просто &quot;замирает&quot;&lt;br&gt;и не переходит к следующей итерации цикла while, чтобы я мог проверить коннект.&lt;br&gt;&lt;br&gt;не ужели мне надо оборачивать все действия с базой в сигнал ALRM&lt;br&gt;судя по этому топику - придется htt</description>
</item>

<item>
    <title>DBI постоянное соединение (test)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10105.html#1</link>
    <pubDate>Sun, 05 Jun 2016 16:30:46 GMT</pubDate>
    <description>Может, стоит просто делать проверку доступности удаленного хоста с базой перед тем как начинать писать в неё? В DBI ещё timeout есть, погуглите.&lt;br&gt;</description>
</item>

</channel>
</rss>
