【发布时间】:2011-08-24 10:21:13
【问题描述】:
我有一个配置了混合 mysql 和 sqlite3 db 连接的 rails 应用程序,为了将特定模型与 sqlite3 相关联,我在每个类定义中添加了一个“建立连接'sqlite_db_config_name'”行。
当我尝试单独保存任何与 sqlite3 连接的模型对象时,保存成功,但是当我尝试保存由其他对象组成的对象时(通过 has_many),我得到一个 BusyException。我有一种感觉,这是因为每个对象都有自己与数据库的连接,并且顶级对象锁定数据库然后调用成员对象的保存方法并且它们无法获取锁定。
我假设有一种方法可以完成这项工作,但我使用的建立连接不正确。
还有人遇到这个吗?
database.yml 配置:
开发者:
development:
adapter: mysql
database: maindb
username: root
password:
host: localhost
sqlite:
adapter: sqlite3
database: db/db.sqlite3
timeout: 15000
模型定义:
class Foo < ActiveRecord::Base
establish_connection 'sqlite'
belongs_to :bar
end
class Bar < ActiveRecord::Base
establish_connection 'sqlite'
has_many :foo
def addFoo(item)
self.foos << item
end
end
class MysqlModel < ActiveRecord::Base
end
其他:
Ruby 1.8.7
Rails 2.3.4
Ubuntu 10.04
更新:
我尝试使用继承来隔离单个类中的建立连接语句,基于 rails doc 的解释,“此功能是通过在 ActiveRecord::Base 中保留一个连接池来实现的,该连接池是由该类索引的哈希。如果请求连接时,retrieve_connection 方法将上升到类层次结构,直到在连接池中找到连接。”。但是由于某种原因,rails 将 sqlite-connected 类的子类与默认的 mysql 连接相关联。所以我放弃了尝试与 sqlite 建立 has_many/belongs_to 关系,并对我的模型进行非规范化。
【问题讨论】:
标签: ruby-on-rails ruby sqlite