簡體   English   中英

Ruby on Rails-多個數據庫連接

[英]Ruby on Rails - multiple database connections

我正在開發一個應用程序,它可以讓用戶建立許多數據庫連接,並且用戶和連接之間具有很多關系。 連接是被動的,直到用戶手動連接每個。 目的是並行地對它們執行查詢。

我找不到與此相關的優秀教程,您可以通過一些技巧來幫助我嗎?

經過研究后,發現使用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

對於我的應用程序,我使用此寶石

https://github.com/thiagopradi/octopus

有好的文檔和示例。

假設您要使用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

注意惡意代碼的用法,例如代碼注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM