Я использую Sequel с Sinatra на сервере Puma/Rack.Как настроить сеансовые подключения к базе данных с Sinatra, Sequel и Rack
Я хочу сохранить свой объект подключения Sequel DB с сеансом - не глобально - чтобы у меня мог быть отдельный пул соединений DB для каждого зарегистрированного пользователя. Цель состоит в том, чтобы иметь доступ к одному серверу базы данных для каждого входа в веб-сервер.
Я не могу решить, как это сделать, поскольку объект базы данных 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
Хм - просто интересно - это еще один способ спросить об этом - позволяет ли стойка разрешить сохранение состояния сеанса в памяти - или состояние для сеанса всегда необходимо сериализовать? –
Ох - просто добавление объектов БД к глобальному хешу, похоже, делает это. Думаю, это сработает. –