I think there might be a bug with the connect_cached() method in DBI. If
the elements in the attributes hashref are in a different order, then it
makes a new handle instead of returning the cached handle, even if they are
the same values. This presents a problem if you are generating the
attributes hashref dynamically, not in the same way every time. (And I
don't think you can ever count on the order of things in a hash).
The code that I think is causing the problem is Line 876 in DBI.pm v 1.15:
my $key = join "~", $dsn, $user||'', $auth||'', $attr ? %$attr : ();
I think it could be remedied by stringifying a sorted version of the hashref
($attr). Here is some sample code (using Sybase) that illustrates the
problem. I think it should apply to other drivers though. You might have
to mess around with the order for a while before it works.
Mitch
----------------------------------------------------
#!/usr/local/bin/perl5 -w
use strict;
use DBI;
use Data::Dumper qw(Dumper);
my $c = 'dbi:Sybase:server=YOURSERVER';
my $u = 'YOURUSERNAME';
my $p = 'YOURPASSWORD';
my $a1 = {
Warn => 1,
CompatMode => 1,
InactiveDestroy => 1,
PrintError => 1,
RaiseError => 1,
ChopBlanks => 1,
LongReadLen => 1,
Taint => 1,
syb_use_bin_0x => 1,
};
my $a2 = {
syb_use_bin_0x => 1,
Warn => 1,
CompatMode => 1,
InactiveDestroy => 1,
PrintError => 1,
RaiseError => 1,
ChopBlanks => 1,
LongReadLen => 1,
Taint => 1,
};
# notice that $a1 and $a2 have exactly the same attributes (syb_use_bin_0x
was just moved to the top)!
my $dbh = DBI->connect_cached($c, $u, $p, $a1);
my $dbh2 = DBI->connect_cached($c, $u, $p, $a2);
print "it was cached\n" if($dbh eq $dbh2);