Sinatra/Rails:在应用程序生命周期内保持自定义类实例
Posted
技术标签:
【中文标题】Sinatra/Rails:在应用程序生命周期内保持自定义类实例【英文标题】:Sinatra/Rails: Persisting custom class instances during app lifetime 【发布时间】:2010-04-24 18:01:17 【问题描述】:我可以断言 rails/sinatra 应用程序只初始化一次并且所有请求共享同一个应用程序吗 实例?还是新请求会产生新的应用实例?
是否可以在不使用会话、数据库存储或第三方服务的情况下实例化自定义类并在应用程序生命周期内持久化它们?如果是这样,从线程安全的角度来看,这意味着什么?
我正在尝试如何实现基于 Web 的下载管理器,并且我目前正在评估基于 ruby 的框架。
【问题讨论】:
【参考方案1】:我可以断言 rails/sinatra 应用程序是 仅初始化一次且所有请求 共享同一个应用实例?或者做新的 请求会产生新的应用实例?
一般不会。这实际上取决于您的设置。如果您只在具有重用相同应用程序对象的服务器(又名机架处理程序)的进程上运行,这将起作用。是否使用相同的应用程序实例取决于您使用的 Web 框架。例如,如果用作 Rack 端点,Sinatra 会为每个请求创建一个新的应用程序类实例(通常为 Sinatra::Application
)。
是否可以实例化自定义 类并在应用程序期间持久化它们 一生不使用会话, 数据库存储或第三方 服务?如果是这样,是什么 线程安全的含义 观点?
如果你真的想持久化类,你可能需要像磁悬浮这样的东西。但是,我相信您的意思是自定义类的持久化实例。如果您不想使用数据库进行持久化(确实应该),您可以回退到 Ruby 附带的 PStore。
【讨论】:
关于 Sinatra 的信息令人震惊。我正在到处寻找有关如何让 Sinatra 在每次请求时不打开新的数据库连接的信息。那么 Sinatra 是不是走错路了?! 为什么会如此震惊? Rails 也会为每个请求创建一个新的控制器实例。只是不要将数据库连接存储为实例变量。例如,您可以执行set :db, DB.connect(...)
,然后以settings.db
的身份从路由中访问它。以上是关于Sinatra/Rails:在应用程序生命周期内保持自定义类实例的主要内容,如果未能解决你的问题,请参考以下文章