2016-10-05 165 views
0

我正在開發一個應用程序,它允許用戶通過用戶和連接之間的多關係建立許多數據庫連接。連接是被動的,直到用戶手動連接每個連接。動機是對它們進行查詢,並行。Ruby on Rails - 多個數據庫連接

我沒有找到與此相關的好教程,你能幫我一些關於如何完成這一點的提示?

+0

希望用戶能夠決定他們多少個連接對其中一個或多個數據庫?另外,當你說並行時你的意思是併發? – bkunzi01

+1

你能解釋一下你正在嘗試做什麼嗎? – gates

+0

我當然希望你放下限制,否則惡意的或無知的用戶可能會讓你失望。 –

回答

2

經過研究了一下,結果發現有一個使用ActiveRecord連接池的更簡單的方法。

  1. 在用戶和數據庫連接之間建立關係,在這種情況下,用戶1..n連接。
  2. 確保模型記錄可以使用

    obj = ActiveRecord::Base.establish_connection(...spec...) 
    
    obj.connection.exec_query("Select * from users") 
    # the response is in the form of ActiveResult, which allows flexible operations around the result. 
    
  3. 關閉一次與數據庫進行連接單獨連接。

參考文獻:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionHandler.html

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

1

假設你想用ActiveRecord的,你可以去兩種方式:

下面的示例演示如何使用這樣的模式, class_name參數是要使用的模型的名稱。它來自Sinatra應用程序,但我相信你可以適應Rails。這是ExtJs JavaScript應用程序的後端,它使用期望JSON的多個模型。

# controller 

%w(create read update destroy).each do |action| 
    [:get, :post].each do |method| 
     send(method, "/path/#{action}") do 
     response.headers['Access-Control-Allow-Origin'] = '*' 
     content_type :json 
     if params[:store] 
      store = Object.const_get(params[:store]) 
     else 
      store = Signal 
     end 
     resp = send(action, store, params) 
     jsonp(resp) 
     end 
    end 
end 

# in helper.rb 

def read (class_name, params) 
    params = params.symbolize_keys 
    default = {store: 'Signaal', limit: 10, sort: 'id', order: 'ASC', start: 0, user: '0'} 
    params = default.merge params 
    generic_data_getter(class_name, params, params[:start], params[:limit], params[:sort], params[:dir]) 
end 

def generic_data_getter (class_name, params, start=0, limit=10, sort='id', dir='ASC') 
    selection = build_selection(class_name, params) 
    data = class_name.where(selection).offset(start).limit(limit).order("#{sort} #{dir}") 
    {:success => true, :totalCount => data.except(:offset, :limit, :order).count, :result => data.as_json} 
end 

如果不是或對於簡單的預定義搜索或速度,您可以連接和斷開連接,因爲需要連接。這裏是Oracle的一個例子。

require 'oci8' 
CONN = OCI8.new('scheme','password','dbserver') 
sql = '....' 
CONN.exec(sql) {|record|puts record.join(',')} 
CONN.logoff 

請注意諸如代碼注入之類的使用法。