The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

DBI постоянное соединение, krpsh (?), 05-Июн-16, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


1. "DBI постоянное соединение"  +/
Сообщение от test (??), 05-Июн-16, 19:30 
Может, стоит просто делать проверку доступности удаленного хоста с базой перед тем как начинать писать в неё? В DBI ещё timeout есть, погуглите.
Ответить | Правка | Наверх | Cообщить модератору

2. "DBI постоянное соединение"  +/
Сообщение от krpsh (?), 05-Июн-16, 21:59 
> Может, стоит просто делать проверку доступности удаленного хоста с базой перед тем
> как начинать писать в неё? В DBI ещё timeout есть, погуглите.

Это все понятно, код который я привел - тестовый.
Т.е. я поднимаю канал, запускаю скрипт, жду когда скрипт вставить пару строк,
затем рву канал и скрипт, бац и замер, и висит до поднятия канала (я ждал 10 мин),
как только канал поднялся снова, скрипт продолжает вставлять строки.
Я полагал, что когда я отрублю канал, скрипт при последующей итерации попытается вставить
строку в базу, но он даже не пытается - вот это и напрягает. Почему так происходит?
В реальном скрипте есть куча проверок на коннект перед выполнением запросов
и даже есть реконнект при не доступности базы (метод ping у DBI).
Но я не мгу проверить доступность базы если канал упал. Скрипт просто "замирает"
и не переходит к следующей итерации цикла while, чтобы я мог проверить коннект.

не ужели мне надо оборачивать все действия с базой в сигнал ALRM
судя по этому топику - придется http://www.opennet.dev/openforum/vsluhforumID9/6774.html
блин, а если я не угадаю с таймаутом (вдруг запрос будет выполняться дольше обычного, да и запросы разные, один - 1сек, другой 25 сек)

Ответить | Правка | Наверх | Cообщить модератору

3. "DBI постоянное соединение"  +/
Сообщение от Аноним (-), 06-Июн-16, 09:10 
>[оверквотинг удален]
> Я полагал, что когда я отрублю канал, скрипт при последующей итерации попытается
> вставить
> строку в базу, но он даже не пытается - вот это и
> напрягает. Почему так происходит?
> В реальном скрипте есть куча проверок на коннект перед выполнением запросов
> и даже есть реконнект при не доступности базы (метод ping у DBI).
> Но я не мгу проверить доступность базы если канал упал. Скрипт просто
> "замирает"
> и не переходит к следующей итерации цикла while, чтобы я мог проверить
> коннект.

Замостите полную версию скрипта. С проверкой ping.

> не ужели мне надо оборачивать все действия с базой в сигнал ALRM
> судя по этому топику - придется http://www.opennet.dev/openforum/vsluhforumID9/6774.html
> блин, а если я не угадаю с таймаутом (вдруг запрос будет выполняться
> дольше обычного, да и запросы разные, один - 1сек, другой 25
> сек)

Ответить | Правка | Наверх | Cообщить модератору

5. "DBI постоянное соединение"  +/
Сообщение от krpsh (?), 06-Июн-16, 09:40 
> Замостите полную версию скрипта. С проверкой ping.

#!/usr/bin/perl

package Testov_test;

use strict;
use warnings;
use utf8;
use open qw(:std :utf8);
use FindBin;
use lib $FindBin::Bin;
use DBI;

my $con_errstr = undef;
my $while_is_enabled = 1;


sub connect_db {
    # connect db
    my $dbh = DBI->connect("dbi:Pg:dbname=db_exp;host=192.168.170.1;port=5432",
                "exp", "111",
                {AutoCommit => 0, RaiseError => 0, PrintError => 0, pg_enable_utf8 => 1, ShowErrorStatement => 1, InactiveDestroy => 1});
    
    unless ($dbh) {
        $con_errstr = "cannot connect on database ($DBI::errstr)";
        return undef;
    } else {
        return $dbh;
    }
}

sub check_connect_db {
    my $dbh = shift;
    
    print "=============check conn db============\n";
    my $conn_db = 0;
    #print "ping=".$dbh->ping."\n";
    unless ($dbh->ping) {
        $dbh = undef;
        $conn_db = 1;
    }
    while ($conn_db) {
        print "lost connect to db, attempt restore the connection (interval 10sec)\n";
        $dbh = connect_db;
        if ($dbh) {
            print "connection to db restored\n";
            last;
        }
        print "sleep 10\n";
        sleep 10;
    }
    print "======================================\n";
    
    return $dbh;
}

my $dbh = connect_db;
if ($con_errstr) {
    print "$con_errstr\n";
    exit;
}

my $query = qq/INSERT INTO proba_connector (id, name, is_del) VALUES (?,?,?)/;
my $sth = $dbh->prepare($query);

while ($while_is_enabled) {
    
    $dbh = check_connect_db($dbh);
    
    print "===============INSERT=================\n";
    
    my @values = (1, 'one', 1,
            2, 'two' ,1,
            3, 'tree', 1);
    
    for (my $a=0; $a<3; $a++) {
                
        my ($id, $name, $is_del) = splice @values, 0, 3;
                
        # RaiseError => 0
        my $rv = $sth->execute($id, $name, $is_del);
        print "state=".$dbh->state."\n";
        unless ($rv) {
            print "ROLLBACK INSERT: ($DBI::errstr) ($DBI::err)\n";
            $dbh->rollback;
            last;
        }
                
        #print "sleep 10 transaction\n";
        #sleep 10;
    }
    print "commit\n";
    $dbh->commit;
    print "======================================\n";
        
    print "sleep 5\n";
}

скрипт отлично работает если базу положить
а вот если упадет туннель, то не работает :-(

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру