2

给定

我有一个模型需要连接到专用的内存 SQLite 数据库。我正在做的是——在这样的类级别创建一个连接(这里我使用提供的连接跳过模式定义ExternalDatabase):

class ExternalDatabase < ActiveRecord::Base
  self.abstract_class = true

  establish_connection(adapter: 'sqlite', database: ':memory:')
end

class MyModel < ExternalDatabase
end

问题

我怀疑上述定义在从多个线程访问时容易出错。一个很好的例子是在运行 Sidekiq 工作线程时,这些工作线程同时从它们的线程写入数据库。

所以问题是:

  1. 从不同线程访问数据库时,我对读/写冲突的怀疑是否正确?是否sqlite将资源锁定在较低级别,从而实现安全的并发读取/写入访问?

  2. 如何在运行时更改与给定模型的内存 SQLite 数据库的连接?ActiveRecord::Base#establish_connection因为我使用的是内存数据库,所以对我不起作用。

    我想实现这样的目标:

    klass = Class.new(ActiveRecord::Base)
    klass.establish_connection(adapter: 'sqlite', database: ':memory:')  
    
    create_schema(klass.connection)
    
    MyClass.connection = klass.connection
    

    但是 Rails 缺乏#connection=对 an 的直接方法ActiveRecord::Base(尽管它没有记录#connection_id,但似乎仍然不起作用。

4

2 回答 2

1

得出两个结论:

  1. 对于内存数据库,线程始终获得唯一的连接,即它自己的数据库版本,将始终是“新鲜的”,并且不会与其他线程中的类似数据库发生干扰。
  2. for regular DB one should make sure connection is establish at a runtime not within the class definition.
于 2013-04-20T20:07:23.540 回答
0

这可能有用。

http://www.sqlite.org/faq.html#q6

我对它的快速阅读表明,您可以通过多个踏板访问同一个 sqlite 数据库而侥幸,但这是您应该尽量避免做的事情,并且会带来一些陷阱。

于 2013-01-29T14:30:49.810 回答