Well explained; I think I understand, thank you.

In my naivety, it seems to me that conceptually a script would normally have
a single shared connection for all it's calls.  Both from a tidiness point
of view and also because I guess it would be better performing not to keep
opening new connections (?).  What is the reason for having the default
opening a new connection and not using an existing one?

i.e. Are there any disadvantages in having a single shared connection for
multiple calls?



-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Behalf Of John
Siracusa
Sent: 11 January 2008 01:25
To: Rose-DB-Object
Subject: Re: [RDBO] Too Many connections


On 1/10/08 5:30 PM, James Masters wrote:
> Looking into this, I seem to simply be doing the following in a "for" loop
> more than 100 times:
>
> my $shipobj = MGORD::Shipment->new(shipid => $shipid)->load(with
=>['items',
> 'costs', 'problems', 'predictedcosts', 'toaddress', 'fromaddress']);
>
> So the implication is that each one of these is opening a new client
> connection and not closing it.
>
> I know I can just increase the default connections limit from 100 to say
200
> to fix the problem.  But is Rose really supposed to be creating all these
> client connections or have I written something wrongly?

When an RDBO-derived object needs a database connection, it calls its db()
method:

    http://search.cpan.org/dist/Rose-DB-Object/lib/Rose/DB/Object.pm#db

If a db object does not yet exist, the init_db() method is called to create
one:

    http://search.cpan.org/dist/Rose-DB-Object/lib/Rose/DB/Object.pm#init_db

The default implementation of init_db() returns a new Rose::DB object, which
in turn will create its own DBI database connection.

If you'd like one or more objects to share a single Rose::DB-derived object
(and therefore a single database connection), a straightforward way to do it
is to explicitly code the sharing:

  my $db = My::DB->new; # share this among all objects created below

  for(...)
  {
    my $shipobj =
      MGORD::Shipment->new(db => $db, ...)->load(...);
  }

If you'd rather not do this explicitly, or if you simply want another
default policy, then you should override the init_db() method, either in
your common base class or in each individual RDBO-derived class, depending
on the policy you want.

For example, if you want all objects of or derived from a given class to
share a single database connection by default, you could use the
new_or_cached() Rose::DB method:

    http://search.cpan.org/dist/Rose-DB/lib/Rose/DB.pm#new_or_cached

writing an init_db() method like this:

    sub init_db { My::DB->new_or_cached }

Remember that no matter what policy you implement in init_db(), you can
always explicitly create and pass a Rose::DB-derived object as that value of
a "db" parameter to any individual object or Manager call.

-John




-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to