Mysql 与Sinatra应用程序中包含的类共享数据库连接

Mysql 与Sinatra应用程序中包含的类共享数据库连接,mysql,ruby,database,sinatra,sequel,Mysql,Ruby,Database,Sinatra,Sequel,我正在将rails应用程序的一部分转换为它自己的sinatra应用程序。它有一些强大的工作要做,而不是在app.rb中有一百万个帮助,我已经将其中的一些分为几个类。由于无法访问rails,我正在重写finder的几个方法,并且需要访问类内的数据库。在应用程序和类之间共享数据库连接的最佳方式是什么?或者您会建议将所有数据库工作推送到它自己的类中,并且只在那里建立连接吗 以下是我在app.rb中的内容 require 'lib/myclass' configure :production do

我正在将rails应用程序的一部分转换为它自己的sinatra应用程序。它有一些强大的工作要做,而不是在app.rb中有一百万个帮助,我已经将其中的一些分为几个类。由于无法访问rails,我正在重写finder的几个方法,并且需要访问类内的数据库。在应用程序和类之间共享数据库连接的最佳方式是什么?或者您会建议将所有数据库工作推送到它自己的类中,并且只在那里建立连接吗

以下是我在app.rb中的内容

require 'lib/myclass'

configure :production do
  MysqlDB = Sequel.connect('mysql://user:password@host:port/db_name')
end
我想在lib/myclass.rb中访问它

class Myclass
  def self.find_by_domain_and_stub(domain, stub)
    # want to do a query here
  end
end

我已经尝试了几种方法,但没有一种方法可以很好地用作示例。

假设您没有执行任何线程,只需将连接设置为全局变量

require 'lib/myclass'

before do
  $MysqlDB = Sequel.connect('mysql://user:password@host:port/db_name')
end

class Myclass
  def self.find_by_domain_and_stub(domain, stub)
    # use $MysqlDB here
  end
end

最好检查连接超时设置,或明确断开与服务器的连接。如果您正在处理大量请求,您可能会在它们超时之前耗尽连接。

蒂姆·罗森布拉特的回答将在每次请求时重新连接。最好在Sinatra应用程序中执行以下操作:

require 'sequel'
DB = Sequel.connect('mysql://user:password@host:port/db_name')
require 'lib/myclass'

在这种情况下,最好使用常量而不是全局变量。

完美,这正是我所需要的。如果我告诉您,应用程序将只为一个api调用服务,该api调用预期只执行一个请求,然后立即关闭连接,您会改变主意吗?后续解决方案是使用块连接调用,我会在西纳特拉的实际行动中,而不是在以前。获取(“…”)执行Sequel.connect('mysql://user:password@主机:端口/db|u name')do | db|。。。我刚刚意识到我对你的回答的评论不是很清楚。在返回结果之前,单个api调用仍然必须执行许多查询并跳过一些复杂的环。我理解您的意思是db将在每次请求时重新连接(如页面加载)。这是您的意思吗?或者您的意思是,每次我在代码中调用全局变量时,都会重新建立db连接?