我有一个配置了mysql和sqlite3数据库混合连接的rails应用程序,为了将特定的型号与sqlite3关联起来,我在每个类定义中添加了一个"establish_connection 'sqlite_db_config_name'“行。
当我尝试单独保存任何与sqlite3连接的模型对象时,保存是成功的,但是当我尝试保存由其他对象组成的对象(通过has_many)时,我得到一个BusyException。我有一种感觉,这是因为每个对象都有自己与数据库的连接,而顶级对象会锁定数据库,然后调用成员对象的save方法,而它们无法获得锁。
我假设有一种方法可以让它工作,但我不恰当地使用了establish_connection。
还有人遇到过这个问题吗?
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
更新:
我尝试使用继承将establish_connection语句隔离在单个类中,这是基于rails文档的解释:“此功能是通过在ActiveRecord::Base中保留一个连接池来实现的,该连接池是由类索引的Hash。如果请求连接,retrieve_connection方法将沿着类层次结构向上移动,直到在连接池中找到连接为止。”但是由于某些原因,rails将sqlite连接的类的子类与默认的mysql连接关联起来。因此,我放弃了尝试使用sqlite建立has_ and / on _to关系,并对我的模型进行了反规范化。
发布于 2011-05-13 04:30:16
我认为"establish_connection 'sqlite'“造成了问题。试着去掉它。对于每个数据库(一个文件),SQLite只允许一个写入连接
如果在没有关闭数据库情况下对数据库执行多次写入,则会导致异常
Rails可以高效和自动地处理连接,所以我认为我们不需要单独建立连接。
https://stackoverflow.com/questions/5983699
复制相似问题