【问题标题】:Sharing a database connection with included classes in a Sinatra application与 Sinatra 应用程序中包含的类共享数据库连接
【发布时间】:2010-04-13 22:01:11
【问题描述】:

我正在将 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

我已经尝试了几件事,但似乎没有一个效果好到甚至可以作为示例包含在内。

【问题讨论】:

    标签: mysql ruby database sinatra sequel


    【解决方案1】:

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

    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
    

    检查连接超时设置或明确断开与服务器的连接可能是明智之举。如果您要处理大量请求,您可能会在它们超时之前用完连接。

    【讨论】:

    • 完美,正是我所需要的
    【解决方案2】:

    Tim Rosenblatt 的回答将在每次请求时重新连接。最好在您的 Sinatra 应用程序中执行以下操作:

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

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

    【讨论】:

    • 如果我告诉您该应用程序将只为一个预期执行单个请求并在之后立即关闭连接的 api 调用服务,您会改变主意吗?
    • 对此的后续解决方案是调用 connect 与一个块,我将在实际的 Sinatra 操作中执行此操作,而不是在之前。 get('...') 做 Sequel.connect('mysql://user:password@host:port/db_name') 做 |db| ...结束结束
    • 刚刚意识到我对您的回答的评论不是很清楚。单个 api 调用仍然必须执行相当多的查询并在返回结果之前跳过一些复杂的循环。我理解你的意思是数据库将在每个请求上重新连接(如页面加载)。这是您的意思还是您的意思是每次我在代码中调用全局变量时都会重新建立数据库连接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2012-02-26
    相关资源
    最近更新 更多