Connection pooling branch ready for testing

Nick Sieger
Fri, 08 Aug 2008 05:55:09 -0000

My connection pooling branch is getting close to being ready for
merging. At this point, I''d appreciate help in trying it out in real
applications and seeing how it behaves, as well as reviewing the code
and documentation. As far as the code goes, 95% of the changes are in
active_record/connection_adapters/abstract/connection_{specification,pool}.rb.

http://github.com/nicksieger/rails/tree/connection_pool

Database/connection pool configuration is as follows.

1. With no changes to database.yml, the connection pooling code falls
back into a cached connection-per-thread compatibility mode. Try your
app with this first, and make sure everything still works as expected.

2. To try out the fixed size connection pool, add a "pool: N"
attribute to the configuration (yaml below, or in ruby if that''s your
new thing):
  production:
    adapter: ...
    ...
    pool: 4   # share a maximum of 4 connections

In order to take advantage of the pool, you actually need to return
connections to the pool after each request. Eventually this should be
baked into ActionPack, but for now you need to add this bit of code to
app initialization. (Note that this can also be used in #1 without any
harm done.)

  Dispatcher.after_dispatch do
    ActiveRecord::Base.clear_active_connections!
  end

There''s also a "wait_timeout" database config attribute that
controls
how long the thread will wait for a connection when the pool is
exhausted (default is 5 seconds). If a thread times out waiting for a
database connection, an ActiveRecord::ConnectionTimeoutError (subclass
of ConnectionNotEstablished) is raised.

In the cleanup/deprecation department, I''d like to propose getting rid
of allow_concurrency. If you look at the code currently you''ll see it
does have an effect -- it basically adds synchronization around
connection handling methods. But just mentioning allow_concurrency
brings up legacy thoughts of past hacks that didn''t really cut the
multi-threaded string cheese. So if possible I''d like to see if
there''s a way to handle both single and multiple thread use cases
without it, even though I don''t have a good idea yet of how to do
that. Thoughts?

As always, comments appreciated.

/Nick