I am having what appears to a memory leak problem on a mod_perl
project I am working on.  On the worst case web page (a search results
page) I am leaking an average of about 160k per page load!  I think
I've finally isolated the problem and it appears to be related to DBI.
It's very possible that I am doing something wrong to cause the
problem.  :-)

First of all, some version and module information.  I am using DBI
1.50 with DBD::ODBC 1.13.  I am using persistent database connections
via the Apache::DBI module.  The project is using mod_perl and
Apache::ASP.

I isolated the problem by commenting out great swaths of code until
the problem went away, and then slowly adding them back in until it
reappeared.  My first thought was that it had something to do with
fetchrow_hashref.  I have a loop like this:

while ($row = $sth->fetchrow_hashref) {
   # do stuff here
}

All of the functionality inside the loop has been commented, but my
memory leak still happens.  However, if I comment the loop entirely,
the leak goes away (well, about 158k of it at least!).

If I replace the loop with something like:

while ($row = $sth->fetchrow_arrayref) {
   # do stuff here
}

... no leak.  I need to get at some of the column names, though, so I
added this line before the loop:

my $column_names = $sth->{NAME};

... and the leak was back!  It stays even if I don't save the column
names into a variable, but just touch them:

$sth->{NAME};

In fact, it even stays if I remove the loop entirely and just include
the line above!  Any ideas why this might be happening and what I
could do to fix it or work around it?  Is there possibly something I'm
doing wrong here?

My next step is going to be to try to make some kind of simple test
outside of the framework of my web probject that reproduces the same
behavior.  I'll post that here when I have it.

Thanks in advance for any insight,

David Brewer

Reply via email to