On Thu, 23 Nov 2006, John Siracusa wrote:
> Hm, I don't recall ever making a "0.756_01" version...
Internal magic, sorry. 0.756 is the version I used.
> Each RDBO object gets its db (if one is not already set) by
> calling init_db(). By default, init_db() returns a new Rose::DB
> object every time it's called.
Ah, interesting.
I was assuming that the "lazy man's approach" of using
Rose::DB::Object::Loader->new(
db_dsn => 'dbi:mysql:dbname=dbtest',
would already work the magic behind the scenes, since using a single
connection is probably a common case.
With the solutions you've mentioned, working around the problem is
definitely feasible, though.
That said, could the loader work the magic so that everything goes
through a single database connection?
BTW, are these DB connections closed?
-- Mike
Mike Schilli
[EMAIL PROTECTED]
> On 11/22/06 11:13 PM, [EMAIL PROTECTED] wrote:
> > Just found this weird case where load(speculative => 1) in
> > 0.756_01 doesn't reuse the database connection, but keeps
> > creating new ones:
>
> Hm, I don't recall ever making a "0.756_01" version...
>
> > for (1..100) {
> > my $p = My::Product->new(name => "myproduct");
> > $p->load(speculative => 1);
> > }
> >
> > If you start this in the debugger and set a breakpoint in DBI::connect,
> > you'll see that it gets hit about 100 times.
>
> Yep, and I think you'll also see that without the "speculative" param. Each
> RDBO object gets its db (if one is not already set) by calling init_db().
> By default, init_db() returns a new Rose::DB object every time it's called.
> Here's the code:
>
> sub init_db { Rose::DB->new() }
>
> If you want all of your My::Product objects to share the same Rose::DB
> object (or maybe just share the same DBI $dbh among many Rose::DB objects)
> you can do that by overriding init_db(), or by using a module that
> transparently shares DBI $dbh handles (e.g., Apache::DBI). Here are some
> examples:
>
> * Every My::Product object gets the same Rose::DB object:
>
> package My::Product;
> ...
> our $DB;
>
> sub init_db { $DB ||= Rose::DB->new }
>
> * Every My::Product object get its own Rose::DB object, but they all
> share a single DBI $dbh.
>
> - Manually:
>
> package My::Product;
> ...
> our $DBH;
>
> sub init_db
> {
> my $db = Rose::DB->new;
> $DBH ||= DBI->connect(...);
> $db->dbh($DBH);
> return $db;
> }
>
> - Automatically:
>
> package My::Product;
> ...
> use Apache::DBI;
>
> sub init_db { Rose::DB->new() }
>
> (In all of the above code, you should think about the eventual destruction
> of those global objects.)
>
> There's no one best way to handle database connection sharing. The right
> solution for a command-line script is very different from the right solution
> for a long-running, persistent environment like a web server.
>
> Finally, remember that no matter what you do in init_db(), you can *always*
> manually pass around and share a db object explicitly. For example,
> revisiting your code:
>
> my $db = Rose::DB->new;
>
> for (1..100) {
> my $p = My::Product->new(name => "myproduct", db => $db);
> $p->load(speculative => 1);
> }
>
> That should only call DBI::connect() once.
>
> -John
>
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Rose-db-object mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/rose-db-object
>
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Rose-db-object mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object