I'm suspicious of your idea that having each client have their own db is
going to be more efficient. Most rdbms are set up to support very large
tables, if you have the proper indexes created, but not neccesarily set
up to support thousands of seperate databases within an rdbms instance.
At least, AR is written assuming you are NOT going to do what you're
trying to do, so you're definitely going to be fighting AR to do this.
But this is really an AR question rather than a mongrel question. You
could try asking on the AR lists.
Jonathan
John Almberg wrote:
On Jan 29, 2009, at 10:17 PM, Will Green wrote:
I'm not sure that instance-specific connections are supported by
ActiveRecord (you can, however, use class-specific connections).
From the
ActiveRecord documentation,
http://api.rubyonrails.org/classes/ActiveRecord/Base.html, the
database
connection information is tied to your model at the class level. I
don't
think you can accomplish what you have described without a separate
Mongrel
cluster for each virtual host.
I'm hoping I can. What I'm going to try next is to use a common
database (the one defined in environment/production.rb) for the
sessions table. Then when I switch the database to the client's db,
the session table won't be affected.
That's the theory, anyway.
Here's an alternate idea:
Assuming you're deploying to a *nix server, what you might try
instead is
having your rails app live in one location on the file system.
Then, since
the only thing that is different is the configuration, for each
domain,
symlink in all but the config directory. The config directory will
then be
unique for each app, but all the code will be shared. When you
update the
application code, simply restart all the mongrel clusters.
Well, if I can get what I need working, I'll only have one shared
mongrel cluster. That is the goal -- to eliminate the need to have
dedicated mongrels for every client. I really don't want to have
hundreds of mongrels cluttering up the system.
BTW, I don't think it is a problem to have multiple mongrel clusters
on one directory. I haven't tried this, but don't see why it wouldn't
work. Just use a different pid for each cluster.
Another idea: you may want to reconsider your application
architecture. Do
you really need a separate database for each host? Could you instead
introduce a ClientAccount class (that has the value from
X_CLIENT_ID as the
Primary Key), and tie it into the other models with has_many
relationships
and a before_filter on the ApplicationController? This way, you
don't need
separate configs, you could point each VirtualHost at the same Mongrel
cluster, AND you could manage the Client Account within rails.
I've thought about that, but each client potentially has thousands of
records in his/her database. I believe the system will get too slow
if all records are in one db, and all clients will be impacted by the
one client who has a million records.
Plus each and every table would have to have client_id in it. That
just smells bad to me. Much simpler to just give each client his own
db and switch on the request. That's what I'm hoping for, anyway.
-- John
_______________________________________________
Mongrel-users mailing list
Mongrel-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-users
--
Jonathan Rochkind
Digital Services Software Engineer
The Sheridan Libraries
Johns Hopkins University
410.516.8886
rochkind (at) jhu.edu
_______________________________________________
Mongrel-users mailing list
Mongrel-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-users