2016-10-05 19 views
0

私は、ユーザーと接続の間に多数の関係を持つ多数のデータベース接続を確立できるアプリケーションを開発しています。ユーザーが手動で接続するまで、接続はパッシブです。その動機は、パラレルにそれらに対してクエリを実行することです。Ruby on Rails - 複数のデータベース接続

私はこれに関する良いチュートリアルを見つけることができません、これを達成するためのヒントを教えてください。私はこの宝石

https://github.com/thiagopradi/octopus

を使用する自分のアプリケーションのために

+0

あなたは、ユーザーが1つ以上のデータベースに対して行う接続数を指示することができるようにしたいですか?また、並列性とは並行性を意味しますか? – bkunzi01

+1

あなたがしようとしていることの詳細を説明できますか? – gates

+0

私は確かにあなたが悪意のある、または無知な、ユーザーがあなたを落とす可能性がある限界に入れて願っています。 –

答えて

2

少し調べたら、ActiveRecord Connectionプールを使用するほうがはるかに簡単な方法があることが分かります。

  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

は良いドキュメントとサンプルを持っています。

1

あなたはActiveRecordを使用すると、二つの方法行くことができます使用したいと仮定すると:

で、このようなモデルを使用する方法の例を私の答えを参照してくださいclass_nameパラメータは、使用するモデルの名前です。これはSinatraアプリからのものですが、Railsに合わせることができると確信しています。これは、結果としてJSONを期待する複数のモデルを使用するExtJsのjavascriptアプリケーションのバックエンドです。

# 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 

コード注入のような悪意のある使用に注意してください。

関連する問題