我正在开发一个应用程序,它允许用户通过用户和连接之间的多关系建立许多数据库连接。连接是被动的,直到用户手动连接每个连接。动机是对它们进行查询,并行。Ruby on Rails - 多个数据库连接
我没有找到与此相关的好教程,你能帮我一些关于如何完成这一点的提示?
我正在开发一个应用程序,它允许用户通过用户和连接之间的多关系建立许多数据库连接。连接是被动的,直到用户手动连接每个连接。动机是对它们进行查询,并行。Ruby on Rails - 多个数据库连接
我没有找到与此相关的好教程,你能帮我一些关于如何完成这一点的提示?
经过研究了一下,结果发现有一个使用ActiveRecord连接池的更简单的方法。
确保模型记录可以使用
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.
关闭一次与数据库进行连接单独连接。
参考文献:
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionHandler.html
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html
假设你想用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
请注意诸如代码注入之类的使用法。
希望用户能够决定他们多少个连接对其中一个或多个数据库?另外,当你说并行时你的意思是并发? – bkunzi01
你能解释一下你正在尝试做什么吗? – gates
我当然希望你放下限制,否则恶意的或无知的用户可能会让你失望。 –