On Fri, Apr 24, 2009 at 10:20:07AM +0100, Martin Evans wrote:
> Hi,
> 
> Early this morning a perl process of ours got the following error on stderr:
> 
> DBD::Oracle::db do failed: ORA-24909: call in progress. Current
> operation cancelled (DBD ERROR: OCIStmtExecute) at
> /usr/lib/perl5/site_perl/5.8.8/DBIx/Log4perl/
> db.pm line 83.

(Setting ShowErrorStatement may help if you're not sure which statement
was affected.)

> The first significant thing is that it was output on stderr and not
> caught by DBI/DBD::Oracle and therefore not signalled as a normal error
> (DBIx::Log4perl has a DBI error handler which never saw it).

I'm not sure what you meant by "not caught by DBI/DBD::Oracle".
The "DBD::Oracle::db do failed:" prefix is only added by the
PrintError/RaiseError/HandleError code.

> Our code is not threaded. Oracles documentation says:
> 
> The OCI call was invoked when another call on the connection was in
> progress. Check if the OCI call is supported when the call is in
> progress under special conditions; for example, if it is being used by a
> signal handler. What this means is that an OCI call (Oracle call
> interface, the lowest language you can program in to access the Oracle
> database) is issued, while another call is still being executed. eg: one
> OCI call tries to read a cursor, but another OCI call, which closes the
> cursor is already in progress.

As it says, check signal handlers, and perhaps exception handlers as it
might be possible for an exception from within a DBD::Oracle call to
leave a handle in a state where a later execute() would cause an error.

Another thing to check is forking, in all it's forms, as the sub-process
would inherit the file descriptors and could cause problems.

Tim.

Reply via email to