代码之家  ›  专栏  ›  技术社区  ›  clyfe

我可以为ActiveRecord(或Mongoid)中的数据库连接和表名设置线程安全的每个请求配置吗?

  •  1
  • clyfe  · 技术社区  · 14 年前

    我的应用程序是这样建模的:

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

    你明白了!

    里面 一个数据库,

    • 保存用户和
    • 为每个用户提供许多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
    


    正如你所看到的,连接是全局的,并且在线程之间共享,但是根据我的应用程序的规格,每个用户都有自己的连接。现在假设两个不同的用户同时发出两个请求。

    有什么选择?

    • 我放弃ActiveRecord,使用裸体DB驱动程序
    2 回复  |  直到 14 年前
        1
  •  4
  •   clyfe    14 年前

    我相信这就是咒语:
    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!
    
        2
  •  0
  •   Gregory Mostizky    14 年前

    Rails通常为每个请求设置一个进程,这样每个http请求都由自己的进程处理。查找apache模块,该模块允许

    在这种配置中,不需要线程安全,实际上活动记录并不是完全安全的