Re: fork and keeping connection DBD::Oracle ?

From: gary sekinger (gary_at_sekinger.com)
Date: 07/30/04


Date: Fri, 30 Jul 2004 16:54:23 GMT

Here's a slightly changed version of the program. This version runs
fine on an older version of DBI but fails on the newer version.

Older version:
        perl: 5.005_03
        dbi: 1.21

Newer version:
        perl: 5.005_03
        dbi: 1.37

Output from the older version:

<rack-bsd27 gsekinger 75> perl test.pl
Fri Jul 30 12:52:21 2004: DBI Version is 1.21
Fri Jul 30 12:52:21 2004: parent: process 876, connected to database
"testzilla" on host "zilla.palab.panasas.com"
Fri Jul 30 12:52:21 2004: parent: 876 now has new child 877
Fri Jul 30 12:52:21 2004: child: 877 is alive
Fri Jul 30 12:52:21 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:21 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:22 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:22 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:23 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:23 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:24 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:24 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:25 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:25 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:26 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:26 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:27 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:27 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:28 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:28 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:29 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:29 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:30 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:30 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:31 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:31 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:32 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:32 2004: child: disconnected
Fri Jul 30 12:52:33 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:34 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:35 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:36 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:37 2004: parent: rc from child was 877
Fri Jul 30 12:52:37 2004: parent: exiting
<rack-bsd27 gsekinger 76>

Output from the newer version:

<cassiar gsekinger 96> perl test.pl
Fri Jul 30 12:51:55 2004: DBI Version is 1.37
Fri Jul 30 12:51:55 2004: parent: process 63901, connected to database
"testzilla" on host "zilla.palab.panasas.com"
Fri Jul 30 12:51:55 2004: parent: 63901 now has new child 63902
Fri Jul 30 12:51:55 2004: child: 63902 is alive
Fri Jul 30 12:51:55 2004: parent: DB Version is '2.0'
Fri Jul 30 12:51:55 2004: child: DB Version is '2.0'
Fri Jul 30 12:51:56 2004: parent: DB Version is '2.0'
Fri Jul 30 12:51:56 2004: child: DB Version is '2.0'
Fri Jul 30 12:51:57 2004: parent: DB Version is '2.0'
Fri Jul 30 12:51:57 2004: child: DB Version is '2.0'
Fri Jul 30 12:51:58 2004: parent: DB Version is '2.0'
Fri Jul 30 12:51:58 2004: child: DB Version is '2.0'
Fri Jul 30 12:51:59 2004: parent: DB Version is '2.0'
Fri Jul 30 12:51:59 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:00 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:00 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:01 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:01 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:02 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:02 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:03 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:03 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:04 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:04 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:05 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:05 2004: child: DB Version is '2.0'
Fri Jul 30 12:52:06 2004: parent: DB Version is '2.0'
Fri Jul 30 12:52:06 2004: child: disconnected
DBD::mysql::db selectrow_array failed: MySQL server has gone away at
test.pl line 75.
Use of uninitialized value at test.pl line 76 (#1)
    
    (W) An undefined value was used as if it were already defined. It
was
    interpreted as a "" or a 0, but maybe it was a mistake. To
suppress this
    warning assign an initial value to your variables.
    
Fri Jul 30 12:52:07 2004: parent: DB Version is ''
Fri Jul 30 12:52:08 2004: parent: DB Version is ''
Fri Jul 30 12:52:09 2004: parent: DB Version is ''
Fri Jul 30 12:52:10 2004: parent: DB Version is ''
Fri Jul 30 12:52:11 2004: parent: rc from child was 63902
Fri Jul 30 12:52:11 2004: parent: exiting
<cassiar gsekinger 97>

program:

#!/usr/bin/perl -w
use strict;
use diagnostics;
use DBI;
use POSIX ":sys_wait_h";

####################################################
# global stuff: database variables & such
####################################################
my $db_host;
my $db_name;
my $db_user_name;
my $db_password;
my $dsn;
my $sql = '';
my $location = 'pan-east';
my $global_child_pid;

sub pan_qa_log($) {
    my $line = $_[0];
    print localtime() . ": $line\n";
}

sub LaunchChild() {
    my $db_version;
    my $pid = fork();
    if (!defined($pid)) {
        # I am the parent, when fork fails
        pan_qa_log("parent: Error: can not fork!");
        return;
    }
    else {
        if ($pid) {
            # I am the parent, when fork succeeds
            pan_qa_log("parent: $$ now has new child $pid");
            $global_child_pid = $pid;
            return;
        }
    }
    pan_qa_log(" child: $$ is alive");
    my $child_dbh = DBI->connect($dsn, $db_user_name, $db_password);
    my $i = 0;
    do {
        $db_version = $child_dbh->selectrow_array(qq{SELECT db_version
FROM location WHERE location = '$location'});
        pan_qa_log " child: DB Version is '$db_version'";
        sleep(1);
        $i++;
    } until ($i > 10);
    $child_dbh->disconnect();
    pan_qa_log " child: disconnected";
    exit(1);
}

##################################################################################
#main program
##################################################################################
my $db_version;
my $i = 0;

pan_qa_log("DBI Version is $DBI::VERSION");

#default values
$db_host = "the mysql host computer";
$db_name = "testzilla";
$db_user_name = "sqluser";
$db_password = "";
$dsn = "DBI:mysql:database=${db_name};host=${db_host}";

my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
pan_qa_log "parent: process $$, connected to database \"$db_name\" on
host \"$db_host\"";

    LaunchChild();

do {
    $db_version = $dbh->selectrow_array(qq{SELECT db_version FROM
location WHERE location = '$location'});
    pan_qa_log "parent: DB Version is '$db_version'";
    sleep(1);
    $i++;
} until ($i > 15);

my $kid = 0;
$kid = waitpid($global_child_pid,&WNOHANG);
pan_qa_log("parent: rc from child was $kid");

$dbh->disconnect();
pan_qa_log "parent: exiting";



Relevant Pages

  • RE: Unable to connect to Oracle on another Unix host in a perl programming using DBI
    ... This is not a DBI issue. ... To those who could help me with a problem connecting to an Oracle database on HP-UX from within a perl script that uses DBI ... In the program I am trying to connect to another unix hostrunning Oracle 8.1.7 holding a table c1dwg. ... The perl script that runs on host A contains these lines. ...
    (perl.dbi.users)
  • sql sERVER sYBASE
    ... My freetds setting is ... [MyServer2k] ... host = x.x.com ... DBI connect ...
    (perl.beginners)
  • DBI:Sybase connect error
    ... I'm trying to log into a sql server 2005 express through perl using ... DBI and DBD::Sybase module. ... [MyServer70] ... host = 10.0.2.12 ...
    (perl.dbi.users)
  • Re: newbie question: using DBI, DBI::mysql
    ... > use strict; ... The DBI is sufficient ... Have you tried specifying the host? ...
    (comp.lang.perl.modules)