【发布时间】:2016-12-26 03:40:55
【问题描述】:
我在 Puma / Rack 服务器中使用 Sequel 和 Sinatra。
我希望将我的 Sequel DB 连接对象与会话一起存储——而不是全局存储——这样我就可以为每个登录的用户拥有一个单独的数据库连接池。其目的是为每个 Web 服务器登录提供一个数据库服务器登录。
我无法弄清楚如何执行此操作,因为 Sequel 数据库对象似乎是全局单例。例如,如果我尝试序列化数据库对象并存储在会话中,我将收到一条错误消息:TypeError - can't dump anonymous class:我不想在每次路由请求时都连接到数据库。
我该怎么做?以下是一些示例代码,希望能表明我想要实现的目标:
require 'sinatra/base'
require 'pp'
require 'sequel'
require 'json'
require 'java'
require 'sqljdbc4.jar'
require 'yaml'
class MyApp < Sinatra::Base
set :sessions, true
use Rack::Session::Cookie, :key => 'rack.session',
:expire_after => 2592000,
:secret => 'sydasx'
get '/' do
db = session[:db]
DB = YAML::Load(db)
response = ''
DB['select * from SEC_USER'].each do |row|
response += row.to_s
end
response.to_json
end
get '/login/:username' do
username = params['username']
puts "username: #{username}"
conn_str = "jdbc:sqlserver://localhost:1434;databaseName=#{username};integratedSecurity=true;"
DB = Sequel.connect(conn_str)
puts "DB: #{DB.pretty_inspect}"
db = YAML::dump(DB)
puts "db: #{db}"
session[:db] = db
"logged in"
end
end
【问题讨论】:
-
嗯 - 只是想知道 - 是另一种提问方式 - Rack 是否允许将会话状态存储在内存中 - 或者会话状态是否总是需要序列化?
-
哦 - 只需将数据库对象添加到全局哈希中似乎就可以了。我想这会奏效。