【问题标题】:Rails with in memory database带有内存数据库的 Rails
【发布时间】:2009-10-21 18:00:00
【问题描述】:

我可以设置 rails 使用带有 MEMORY 的 mysql 作为数据库引擎吗?我从不重新启动mysql,并且经常重建数据库,我宁愿让它快点。拥有用于运行测试的内存数据库也很好。

编辑:我应该指定这仅用于开发/测试,而不是生产。

【问题讨论】:

    标签: mysql ruby-on-rails memory


    【解决方案1】:

    我不明白你为什么不能;您选择的存储引擎是 MySQL 实现细节。您只需在迁移的 create_table 声明中设置 :options => "ENGINE=MEMORY"

    当然,我也不明白你为什么会——尤其是在生产中。 MEMORY 引擎的 MySQL 文档是 full of caveats,就像固定长度的字段分配一样,与丢失所有内容的风险相比,您实现的速度提升必须是微不足道的。如果您的应用程序不需要持久化任何东西,为什么不完全跳过 ActiveRecord 并将您的模型分层到 Memcached 之上?

    【讨论】:

    • 我本来应该说的,但这不是为了生产,只是我在开发。那么将引擎放入迁移不是一种选择(除非我根据环境有条件地这样做)
    • 所以根据环境有条件地做。为什么这不是一个选择? :options => (RAILS_ENV != 'production' ? "ENGINE=MEMORY" : nil)(请确保您的测试不会被仅存在于内存引擎中的一些怪异所影响。就我个人而言,我仍然不会为此烦恼;但如果您真的认为数据库速度是您的测试瓶颈,请自责出来。)
    • 因为我不想将迁移提交到 scm 中包含所有这些废话。我只想在我自己的小世界中本地做,如果当我不得不进行数据库重建或其他事情时它让我的事情变得更快,然后赢,但如果不是,谁在乎,我只是使用常规设置。从答案和其他一些阅读中可以看出,它的工作量超过了它的价值(甚至可能不值得)。
    • 赞成并接受,因为这似乎是这样做的方式。
    【解决方案2】:

    我在内存数据库中使用 sqlite3 进行测试。它通常比基于文件的速度快一点,但除非你有大量的测试数据,否则不会那么快。

    要设置它,您的 database.yml 将如下所示:

    test:
    adapter: sqlite3
    database: ":memory:"
    

    您还必须在测试助手中将架构加载到内存数据库中,如下所示:

    config = YAML::load(IO.read(File.dirname(__FILE__) + "/../config/database.yml"))
    ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/../log/debug.log")
    ActiveRecord::Base.establish_connection(config["test"])
    load(File.dirname(__FILE__) + "/../db/schema.rb")
    

    【讨论】:

    • 为什么需要在测试中建立连接?我认为这是 Rails 会为你做的事情。
    • 我也做过这个,很不错,但是由于它和 MySQL/PostgreSQL 之间的差异,我在本地停止使用 SQLite。 ActiveRecord 隐藏了大部分细节,但有足够的差异让它烦人。
    • 必须在运行测试之前建立连接,以便在加载 rails 之前将模式加载到内存数据库中。我知道加载它的唯一地方是在测试助手中,此时没有通过 rails 与数据库建立连接。如果我错了,或者有更简单的方法,请纠正我。
    【解决方案3】:

    出于测试目的考虑使用https://github.com/mvz/memory_test_fix 插件。它的使用就像更新database.yml 和运行一样简单

    rails plugin install git://github.com/mvz/memory_test_fix.git
    

    您也可以尝试安装 memory_test_fix gem,但它来自不同的 git 分支,不支持 Rails 3。

    gem 帮助我将测试用例的执行时间从 25 秒减少到 19 秒。另一方面,它在数据库模式初始化上引入了 2 秒的开销(我没有那么多)。因此,在小型测试集上,不值得打扰。

    杰森·斯图尔特回答的解决方案基本相同。我用它代替了插件,因为它更容易与Spork插件结合。

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多