Apache::DBI connect

Xinhuan Zheng <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <CEA019BE.546BE%[email protected]>
Hi,

I am using Apache+mod_perl and Apache::DBI with Oracle connection pooling feature. I noticed a problem with subroutine connect. Below code checks  database connection:

200:    if ($Connected{$Idx} and (!$needping or eval{$Connected{$Idx}->ping})) {
        debug(2, "$prefix already connected to '$Idx'");

        # Force clean up of handle in case previous transaction failed to
        # clean up the handle
        &reset_startup_state($Idx);

        return (bless $Connected{$Idx}, 'Apache::DBI::db');
    }

Due to the oracle connection pooling, some oracle server processes has terminated the connection, causing httpd process in CLOSE_WAIT state. I did get this message in error_log when eval{$Connected{$Idx}->ping  failed:

DBD::Oracle::db ping failed: ORA-03113: end-of-file on communication channel
Process ID: 28345
Session ID: 3220 Serial number: 504 (DBD ERROR: OCIStmtExecute/Describe) at /usr/local/lib/perl5/site_perl/5.8.3/Apache/DBI.pm line 200


Below is subsequent code:

    213     delete $Connected{$Idx};
    214     $Connected{$Idx} = $drh->connect(@args);
    215     return undef if !$Connected{$Idx};

After line 214 executes,  it doesn't establish a valid new connection. The httpd process is still in CLOSE_WAIT state.

I wonder this line of code should be changed to 'DBI->connect(@args) if ($@)'. If ping failed, that means the connection is already closed, $drh may be no longer valid, will $drh->connect always return a valid new connection? What's the difference between DBI->connect vs $drh->connect?

Thanks,
- xinhuan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.