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
> Rose-db-object@lists.sourceforge.net
> 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
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to