Могу ли я иметь потокобезопасную конфигурацию для каждого запроса для соединения с базой данных и имя_таблицы в ActiveRecord (или Mongoid)? - PullRequest
1 голос
/ 22 сентября 2010

Также известен как вопрос «У пользователя много баз данных». >>

Среда

Мое приложение смоделировано так:

user has_many databases  
database has_many tables  
table has_many rows  
row habtm(+value) columns   

Вы поняли!

Таким образом, вместо моделирования базы данных внутри базы данных, я хотел бы иметь:

  • базу данных sqlite3, которая содержит пользователей и
  • множество баз данных sqlite для каждого пользователя

Каждый пользователь будет LCRUD свои таблицы в своих базах данных (аналог phpmyadmin)

Проблема

Я хотел бы иметь потокобезопасную конфигурацию для каждого запроса для соединения с базой данных и имя_таблицы

class Table < ActiveRecord::Base
end

# in some controller
# set the connection to the user-selected database from some DB list
Table.connection = current_user.session.connection
# set the name to the user-selected table from some tables list
Table.table_name = params[:table_name]
@rows = Table.all #display them

EDIT
Как видите, соединение является глобальным и разделяется между потоками, но каксогласно спецификациям моего приложения, каждый пользователь имеет свое собственное соединение.А теперь представьте, что 2 разных пользователя делают 2 запроса одновременно.

Опции?

  • Я отказываюсь от ActiveRecord и использую драйвер БД с пустыми костями
  • Я отказываюсь от темы безопасности

Ответы [ 2 ]

4 голосов
/ 25 сентября 2010

Я считаю, что это заклинание:
Используйте Class.new(AR::Base) для динамического создания классов

post_class = Class.new(ActiveRecord::Base)
post_class.connection = set_up_connection()
post_class.table_name = :posts

@posts = post_class.all
puts @posts

# note: post_class will get GC'ed at scope end just like any var, sweet!
0 голосов
/ 22 сентября 2010

Rails обычно настраивается с процессом на запрос, чтобы каждый http-запрос обрабатывался своим собственным процессом.Ищите пассажира для модуля apache, который позволяет

. В такой конфигурации нет необходимости в безопасности потоков, поскольку активная запись не полностью безопасна afaik

...