Can't call method prepare on an undefined value

2007-07-22 Thread Dustin D.

I'm having countless problems with mod_perl and not even sure where to
start.  I thought I had mod_perl up and running in my development
environment, so I pushed the new changes + apache configuration out to my
production environment, and immediately began tail -f on the logs.

What I noticed was, most of the time, everything was working fine.  But it
seemed like every few minutes, there would be a burst of the following
errors:

Can't call method prepare on an undefined value at modules//MySQLBroker.pm
line 1059.\n

What's strange is, when this error would pop up, it would flood 5-10 errors
like this in a row, all within the span of a few seconds.  Then things would
return to normal and I wouldn't get any errors for awhile.

On my site, I'm getting hits every couple of seconds, if not more
frequently.  In my startup.pl, I have something like this to initialize the
MySQL connection:

Apache::DBI-connect_on_init(DBI:mysql:mydb:127.0.0.1, dustin, mypass,
   {
PrintError = 1, # warn( ) on errors
RaiseError = 0, # don't die on error
AutoCommit = 1, # commit executes immediately
   }
);

(NOTE: for the hostname, I was using localhost for awhile, and decided to
use a direct ip in case localhost is actually being resolved, to get rid of
one more layer of translation)

My code around line 1059 in MySQLBroker.pm looks like this:

sub _mysql_exec {
 my ($self, $dbcall) = @_;
 my @resultsArray;
 my $count=0;
 my $sth = $self-{_dbh}-prepare($dbcall);
 $sth-execute or die Cannot execute database command!;
 while (my @array = $sth-fetchrow) {
   push @resultsArray, [EMAIL PROTECTED];
 }
 $sth-finish;
 return [EMAIL PROTECTED];
}

Also, on a fairly inconsistent basis, I'm also getting not a CODE
reference errors.

To me, it just seems like mod_perl is very unreliable and unpredictable.
The same code that worked reliably (albeit slow) in the CGI world is now
extremely unpredictable in the mod_perl world.

FYI, I'm aware of the persistent state issues in a mod_perl world and have
gone to great lengths to debug any persistent state issues that might be
affecting things.

At this point in time, I'm extremely tempted to rewrite everything in PHP.
I really want to avoid that, but mod_perl is causing me too many headaches
to justify it, as I've already wasted a week of effort trying to migrate my
site from CGI to mod_perl.

Thanks,
Dustin


Re: Can't call method prepare on an undefined value

2007-07-22 Thread Foo JH
Does this happen during idle period? MySQL does disconnect when the idle 
is too long.


Dustin D. wrote:
I'm having countless problems with mod_perl and not even sure where to 
start.  I thought I had mod_perl up and running in my development 
environment, so I pushed the new changes + apache configuration out to 
my production environment, and immediately began tail -f on the logs.


What I noticed was, most of the time, everything was working fine.  
But it seemed like every few minutes, there would be a burst of the 
following errors:


Can't call method prepare on an undefined value at 
modules//MySQLBroker.pm line 1059.\n


What's strange is, when this error would pop up, it would flood 5-10 
errors like this in a row, all within the span of a few seconds.  Then 
things would return to normal and I wouldn't get any errors for awhile.


On my site, I'm getting hits every couple of seconds, if not more 
frequently.  In my startup.pl, I have something like this to 
initialize the MySQL connection:


Apache::DBI-connect_on_init(DBI:mysql:mydb: 127.0.0.1 
http://127.0.0.1, dustin, mypass,

{
 PrintError = 1, # warn( ) on errors
 RaiseError = 0, # don't die on error
 AutoCommit = 1, # commit executes immediately
}
);

(NOTE: for the hostname, I was using localhost for awhile, and decided 
to use a direct ip in case localhost is actually being resolved, to 
get rid of one more layer of translation)


My code around line 1059 in MySQLBroker.pm looks like this:

sub _mysql_exec {
  my ($self, $dbcall) = @_;
  my @resultsArray;
  my $count=0;
  my $sth = $self-{_dbh}-prepare($dbcall);
  $sth-execute or die Cannot execute database command!;
  while (my @array = $sth-fetchrow) {
push @resultsArray, [EMAIL PROTECTED];
  }
  $sth-finish;
  return [EMAIL PROTECTED];
}

Also, on a fairly inconsistent basis, I'm also getting not a CODE 
reference errors.


To me, it just seems like mod_perl is very unreliable and 
unpredictable.  The same code that worked reliably (albeit slow) in 
the CGI world is now extremely unpredictable in the mod_perl world.


FYI, I'm aware of the persistent state issues in a mod_perl world and 
have gone to great lengths to debug any persistent state issues that 
might be affecting things.


At this point in time, I'm extremely tempted to rewrite everything in 
PHP.  I really want to avoid that, but mod_perl is causing me too many 
headaches to justify it, as I've already wasted a week of effort 
trying to migrate my site from CGI to mod_perl.


Thanks,
Dustin




Re: Can't call method prepare on an undefined value

2007-07-22 Thread Dondi Stroma
Where is your DBI connect method? Do you have error checking in place in 
case the connect fails?  If the connect fails, your database handle will be 
undef.


Try adding

or die DBI-errstr;

to your connect method as well as the prepare on line 1059.

- Original Message - 
From: Dustin D.

To: modperl@perl.apache.org
Sent: Sunday, July 22, 2007 11:38 AM
Subject: Can't call method prepare on an undefined value


I'm having countless problems with mod_perl and not even sure where to 
start.  I thought I had mod_perl up and running in my development 
environment, so I pushed the new changes + apache configuration out to my 
production environment, and immediately began tail -f on the logs.


What I noticed was, most of the time, everything was working fine.  But it 
seemed like every few minutes, there would be a burst of the following 
errors:


Can't call method prepare on an undefined value at modules//MySQLBroker.pm 
line 1059.\n




Re: Can't call method prepare on an undefined value

2007-07-22 Thread Perrin Harkins

On 7/22/07, Dustin D. [EMAIL PROTECTED] wrote:

I thought I had mod_perl up and running in my development
environment, so I pushed the new changes + apache configuration out to my
production environment, and immediately began tail -f on the logs.

What I noticed was, most of the time, everything was working fine.  But it
seemed like every few minutes, there would be a burst of the following
errors:

Can't call method prepare on an undefined value at modules//MySQLBroker.pm
line 1059.\n


Did you see these in your development environment?  How did you make
the code live?  Did you restart the server or did you use something
like Apache::Reload?


What's strange is, when this error would pop up, it would flood 5-10 errors
like this in a row, all within the span of a few seconds.  Then things would
return to normal and I wouldn't get any errors for awhile.


It sounds like your MySQL server is dropping the connections, or else
you have multiple processes sharing a connection.  Do you do anything
during the startup (in httpd.conf or called from httpd.conf) that
opens database connections?


(NOTE: for the hostname, I was using localhost for awhile, and decided to
use a direct ip in case localhost is actually being resolved, to get rid of
one more layer of translation)


Ironically, you actually made it slower there.  If you specify
'localhost' or empty string for the server, it will connect using Unix
domain sockets instead of TCP.  This is a significant performance
improvement for simple queries.  See the DBD::mysql dcos for more
info.


My code around line 1059 in MySQLBroker.pm looks like this:

sub _mysql_exec {
  my ($self, $dbcall) = @_;
  my @resultsArray;
  my $count=0;
  my $sth = $self-{_dbh}-prepare($dbcall);


You shouldn't store a $dbh in your objects like this.  Apache::DBI
will check that your connection is still good when you try to use it,
but only if you call connect().  If you don't, your connection can go
stale and get dropped.


Also, on a fairly inconsistent basis, I'm also getting not a CODE
reference errors.


Which part of the code gives you that?


To me, it just seems like mod_perl is very unreliable and unpredictable.
The same code that worked reliably (albeit slow) in the CGI world is now
extremely unpredictable in the mod_perl world.


It's 100% predictable.  You just don't understand how your code works
in a persistent environment yet.  Give yourself a little time before
you throw in the towel.  And ask more questions if you're confused.
No need to wait a week and get frustrated before asking for help.

- Perrin