Fast sql based session storage for Rails
Ruby
Latest commit 63c9cd0 Jul 6, 2009 @skaes rails 2.3 compatibility

README

== SqlSessionStore

See http://railsexpress.de/blog/articles/2005/12/19/roll-your-own-sql-session-store

Only Mysql, Postgres and Oracle are currently supported (others work,
but you won't see much performance improvement).

== Step 1

If you have generated your sessions table using rake db:sessions:create, go to Step 2

If you're using an old version of sql_session_store, run
    script/generate sql_session_store DB
where DB is mysql, postgresql or oracle

Then run
    rake migrate
or
    rake db:migrate
for new versions of Rails.

== Step 2

Initialisation depends on the Rails version being used:

=== Older Rails versions

If you are using a version before 2.3, add the code below after the
initializer config section:

    ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.
      update(:database_manager => SqlSessionStore)

Then, depending on your database type, add

    SqlSessionStore.session_class = MysqlSession
or

    SqlSessionStore.session_class = PostgresqlSession
or
    SqlSessionStore.session_class = OracleSession

after the initializer section in environment.rb

=== Rails 2.3

Rails 2.3 uses rack based sessions, which require that the session
storage manager shows up in a certain position in the middleware
stack. The Rails initializer has special code built in to ensure this
for active record store. Therfore, the following steps will ensure that
sql session store ends up in the correct place:

* set up active recordstore as the session store in the config section
* replace active record store with sql session store after the initializer section

  Rails::Initializer.run do |config|
    config.action_controller.session_store = :active_record_store
    ...
  end
  ...
  ActionController::Dispatcher.middleware.swap(:"ActiveRecord::SessionStore", SqlSessionStore)
  ActionController::Base.session_store = SqlSessionStore
  SqlSessionStore.session_class = MysqlSession

It is really important that sql session store ends up in the same place in
the middleware stack as active record store. More specifically: it
must be placed below the connection management middleware.

Your middleware stack should look similar to the following one:

  use Rack::Lock
  use ActionController::Failsafe
  use ActionController::Reloader
  use ActiveRecord::ConnectionAdapters::ConnectionManagement
  use ActiveRecord::QueryCache
  use SqlSessionStore
  use ActionController::ParamsParser
  use Rack::MethodOverride
  use Rack::Head
  run ActionController::Dispatcher.new

You can run rake middlware to verify your setup.

== Step 3 (optional)

If you want to use a database separate from your default one to store
your sessions, specify a configuration in your database.yml file (say
sessions), and establish the connection on SqlSession in
environment.rb:

   SqlSession.establish_connection :sessions


== IMPORTANT NOTES

1. The class name SQLSessionStore has changed to SqlSessionStore to
   let Rails work its autoload magic.

2. You will need the binary drivers for Mysql or Postgresql.
   These have been verified to work:

   * ruby-postgres (0.7.1.2005.12.21) with postgreql 8.1
   * ruby-mysql 2.7.1 with Mysql 4.1
   * ruby-mysql 2.7.2 up to 2.7.7 with Mysql 5.0