Perrin,

I am starting to feel guilty about bugging you so much, but you are the only
person to have responded, and I watch the list enough to value your advice
quite a bit. 

>>sub new {         
>>            my $invocant = shift;
>>            my $class = ref($invocant) || $invocant;
>>
>
>That looks like voodoo code copied from a man page.  If you call this as 
>Holds->new(), you don't need that junk about ref.  (And most people 
>recommend against the "new Holds" syntax.)
>
>>            my $self  = { @_ };
>>            bless ($self, $class);
>>            $dbh = db_connect();
>>
>
>You don't seem to need this.  You aren't using the database handle for 
>anything in this sub and you aren't gaining anything by calling it here.


I wanted the DBH to be global since just about every sub in Holds does a
query of some sort. I guess it doesn't matter either way if I do the connect
in the new() vs  up top outside of a sub. 

What is the problem with the my $holdcheck = new Holds() type of syntax?
I never read anything about that either way. 

>
>>sub GetProcessed {
>>
>>my $self = shift;
>>
>>        #### This has a bug, somtimes the cached query doesn't stick around.
>>
>
>If you lose your database connection, Apache::DBI will reconnect.  Any 
>prepared queries will be lost.  You *must* prepare every time, but see 
>below...
>
>>sub db_connect {
>>
>>require DBI;
>>
>
>You don't need that.  You should have already loaded it in startup.pl.
>
>>my $dbname = 'CS';
>>my ($dbuser, $dbpasswd) = ('myuser', 'mypass');
>>
>
>Probably should be in a config file, rather than buried in here.
>
>>my $dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpasswd)
>>   or die "can't connect: $DBI::errstr\n";
>>   
>>   # we need these waiting for queries, so we are going to prepare them
ahead of
>> time, and yes
>>   # horror of horror they will be global. Sorry Mom I tried :( 
>>   $processed_hnd = $dbh->prepare_cached("select ord_tpak_processed from
orders
>>where ord_num=?") or confess("can't get tpak processed");
>>   $status_hnd = $dbh->prepare_cached("select is_hold_set,holdstate from
>>holds where ord_num=?") or confess("can't get hold status");
>>   #DBI->trace(2,"/usr/local/apache/htdocs/out.log");
>>   return $dbh;
>>
>
>Don't put those in globals.  The prepare_cached call already stores them 
>for the life of your database connection.  Apache::DBI will keep that 
>connection alive (in a global hash) as long as it can and reconnect if 
>the connection is lost.  If the connection does get lost, the statement 
>handles in these globals will stop working.  You do recreate them every 
>time since you call this sub every time, but you could lose the 
>connection between the time this sub is called and the time you use 
>these handles.
>

I did this, I was a little scared about calling $dbh->finish() but I did
what you said, and yes life is good I don't notice a speed difference. 

>>4. I know the way I have done these db connects is sloppy. But I can't seem
>>to find a better way. Could I make one db_connect sub,and inherite it all
>>though my modules? 
>>
>
>Make one sub that returns a database handle and use it from everywhere. 
> Doesn't need to be inherited, you can just stick it in a module that 
>all the other modules call.

I have no idea why I put off doing that for so long. But that is done now as
well. 


>
>Hope some of that was helpful,
>Perrin
>

(250) 655 - 9513 (PST Time Zone)

"Inquiry is fatal to certainty." -- Will Durant 




Reply via email to