Hi Perrin,

I am using Oracle Resident Connection Pool feature. The application randomly 
got "ORA-03114 not connect to oracle database" error. As per this document:

http://search.cpan.org/~phred/Apache-DBI-1.12/lib/Apache/DBI.pm

I have changed the DBD::Oracle to use the following ping instead of ora_ping:

sub ping {
my ($dbh) = @_;
my $ret = 0;
eval {
local $SIG{__DIE__} = sub { return (0); };
local $SIG{__WARN__} = sub { return (0); };
# adapt the select statement to your database:
$ret = $dbh->do('select 1');
};
return ($@) ? 0 : $ret;
}

After this change, the application can detect "end-of-file communication" error 
then after the application establishes new connection, the application still 
throws "ORA-03114 not connect to oracle database" error.

below is the errors when Apache::DBI debug is set:

3861 Apache::DBI             need ping: yes
DBD::Oracle::db ping failed: ORA-03113: end-of-file on communication channel
Process ID: 29671
Session ID: 3219 Serial number: 544 (DBD ERROR: OCIStmtExecute/Describe) at 
/usr/local/lib/perl5/site_perl/5.8.3/Apache/DBI.pm line 200.
3861 Apache::DBI             new connect to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to '...'
3861 Apache::DBI             need ping: yes
DBD::Oracle::st execute failed: ORA-03114: not connected to ORACLE (DBD ERROR: 
OCIStmtExecute)
3861 Apache::DBI             need ping: yes
3861 Apache::DBI             already connected to ''
3861 Apache::DBI             disconnect (overloaded)
[Wed Nov  6 16:49:50 2013] [crit] ORA-03114: not connected to ORACLE (DBD 
ERROR: OCIStmtExecute).

Process 3861 establishes a new connection. and it says "already connected to" 
database. While the query execution failed with "ORA-03114" and the httpd 
process is in CLOSE_WAIT state. How does it thinks it's already connected while 
it's actually not?


  *   xinhuan

------------------------------------------------------------------------------------------------------------------------------------------------------------

From:  Perrin Harkins <phark...@gmail.com<mailto:phark...@gmail.com>>
Date:  Wednesday, November 6, 2013 5:54 PM
To:  Xinhuan Zheng <xzh...@christianbook.com<mailto:xzh...@christianbook.com>>
Cc:  mod_perl list <modperl@perl.apache.org<mailto:modperl@perl.apache.org>>
Subject:  Re: Apache::DBI connect



On Wed, Nov 6, 2013 at 4:07 PM, Xinhuan Zheng
<xzh...@christianbook.com<mailto:xzh...@christianbook.com>> wrote:

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?



The $drh there is a DBI driver, not a database handle.  It should return a new 
connection every time.  You can try putting in DBI->connect() there and see if 
it fixes the problem for you though.  If not, I'd suggest reporting the problem 
as a DBD::Oracle issue.

By the way, which Oracle pooling solution are you using and how is it working 
out for you, aside from this problem?

- Perrin


Reply via email to