[Dbix-class] Problem using DBIC in a Catalyst/mod_perl environment with multiple virtual hosts

Matt S Trout dbix-class at trout.me.uk
Tue Aug 22 17:37:41 CEST 2006


Andreas Dembach wrote:
> Hello list,
> 
> we have the following situation:
> 
> - we are migrating mod_perl application to Catalyst under mod_perl2 and
> use DBIC as persistence layer.
> - the apache server hosts two (in fact even more) virtual hosts with the
> same application but different configurations (e.g. one for test and one
> for production).
> - beneath other configuration items, like template-root we want the
> different virtual hosts to use different database connections.
> 
> Problem:
> 
> As far as I can tell from the source code, DBIx::Class::Storage::DBI
> caches the database handle in '_dbh' which results in always using the
> first database handle that inititated a connection. So we end up having
> the configured $dbh of whatever virtual host  is called first within a
> newly created Apache process.
> 
> Question:
> 
> Is this a design decision to support only one DB connection per process
> or is this a little bug that could be fixed by caching the dbh with some
> additional meta info (e.g. the connection parameters à la
> DBI->connect_cached)?

This is neither a design decision nor a bug. You've just misunderstood how 
stuff works.

DBIx::Class supports as many connections to different databases per process as 
you like. Catalyst::Model::DBIC::Schema can handle being instantiated multiple 
times with different connections.

The problem is that the model references in Catalyst are held as 
one-per-process by default. Get rid of your nasty hack in Storage and add an 
ACCEPT_CONTEXT method to your C::M::DBIC::Schema class that returns the 
appropriate one based on whatever; this is documented in Catalyst::Component.

Catalyst will support multiple instances of the same app with different 
configurations for 5.80, but 5.70 doesn't; if you're interested, there's a 
branch in the Catalyst repository but discussion of that should probably be on 
either the catalyst or catalyst-dev lsits rather than here :)

-- 
      Matt S Trout       Offering custom development, consultancy and support
   Technical Director    contracts for Catalyst, DBIx::Class and BAST. Contact
Shadowcat Systems Ltd.  mst (at) shadowcatsystems.co.uk for more information

+ Help us build a better perl ORM: http://dbix-class.shadowcatsystems.co.uk/ +



More information about the Dbix-class mailing list