【问题标题】:How to setup session based database connections with Sinatra, Sequel and Rack如何使用 Sinatra、Sequel 和 Rack 设置基于会话的数据库连接
【发布时间】: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 是否允许将会话状态存储在内存中 - 或者会话状态是否总是需要序列化?
  • 哦 - 只需将数据库对象添加到全局哈希中似乎就可以了。我想这会奏效。

标签: ruby rack sequel puma


【解决方案1】:

您不能序列化 Sequel::Database 对象。你有几个不错的选择:

  1. 使用机架中间件,为每个请求创建一个 Sequel::Database 对象,该对象仅用于请求。在这种情况下,您不会将 Sequel.connect 的结果分配给常量,而是传递一个块并调用该块内的下一个变量。

  2. 在顶层创建单个 Sequel::Database 对象并将其存储在 DB 常量中。将任意服务器和服务器块扩展为 Sequel::Database 对象。然后使用机架中间件在块期间检查与适当服务器的连接。

  3. 如果您的客户很少,可以只使用 Sequel 的分片支持并仅使用 server_block 扩展而不使用任意服务器。这样做的一个好处是可以缓存连接,因此您不必为每个请求建立单独的数据库连接(1. 和 2. 都是这种情况)。

  4. 使用您提到的全局哈希,键是用户名,值是 Sequel::Database 对象。如果这样做,您需要确保有足够的内存来存储您要跟踪的所有对象。

【讨论】:

  • 谢谢杰里米。选项 2 听起来很有趣。我们意识到我们在继承自 Sequel::Model 的模型类中存在类似的问题,这些模型类是包含数据库连接的全局单例。选项 2 也可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 2015-12-12
  • 2011-12-03
  • 2023-03-24
  • 1970-01-01
  • 2012-08-21
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多