我的数据库连接相互覆盖存在问题。
我创建了两个单独的连接,但是当我调用$db1.execute_sql
时,$db2.execute_sql
实际上是被调用的。
这就是我所拥有的:
servers.yml:
db1:
adapter: jdbc
driver: oracle.jdbc.driver.OracleDriver
url: db_1_url
username: my_username
password: m_password
db2:
adapter: jdbc
driver: oracle.jdbc.driver.OracleDriver
url: db_2_url
username: my_username
password: m_password
ServerContext类:
class ServerContext
def initialize (env)
connect(env)
end
def connect(env)
begin
config = YAML.load_file("features/config/servers.yml")
rescue
puts "cannot load config/servers.yml"
end
@connection = ActiveRecord::Base
@connection.establish_connection(config[env])
end
def execute_sql(sql_string)
@connection.connection.execute(sql_string)
end
数据库设置:
def connect_databases
$db1 = ServerContext.new('db1')
$db2 = ServerContext.new('db2')
end
答案 0 :(得分:1)
你正在做
@connection = ActiveRecord::Base
我认为当你为连接使用相同的类静态方法两次时,第二次只是重写前一个连接。
为每个连接创建一个从ActiveRecord :: Base扩展的类:
class DB1 < ActiveRecord::Base
self.abstract_class = true
end
class DB2 < ActiveRecord::Base
self.abstract_class = true
end
然后,在你的连接方法中:
case config[env]
when 'db1'
@connection = DB1
when 'db2'
@connection = DB2
end
答案 1 :(得分:1)
当前连接是一个线程局部变量,因此您一次只能将其设置为一个 - http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html 您需要两个从ActiveRecord :: Base继承的单独类来执行您想要的操作
答案 2 :(得分:0)
因此新的activeRecord将连接存储在基于类名的哈希中。所以每次我在ActiveRecord中覆盖连接(不在类本身中)。请参阅http://api.rubyonrails.org/classes/ActiveRecord/Base.html并查看“连接到不同模型中的多个数据库”。