使用原始SQL时如何使用ActiveRecord :: Base.connection?

时间:2019-06-26 06:43:03

标签: ruby-on-rails activerecord

在模型中执行添加连接

def self.execute_sql(*sql_array)
  connection.execute(send(:sanitize_sql_array, sql_arry))
end

在这种情况下如何关闭连接?这是个好方法吗?

def self.close_connection
  connection.close
end

顺便说一下,它与ActiveRecord::Base.connection.execute有点不同。他们是一样的吗?

1 个答案:

答案 0 :(得分:1)

假定为默认值,则所有模型都应继承自ActiveRecord::Base,因此ActiveRecord::Base.connection.execute和您的connection.execute(...)方法应完全相同(仅当调用超级方法时除外)。

现在,您的execute_sql方法似乎有点不同,它接受*sql_array参数(这是一个数组),这意味着语法与ActiveRecord::Base.connection.execute有所不同,因为您现在可以为SQL提供经过过滤的参数:即User.execute_sql('SELECT * FROM users WHERE created_at > ?, Time.zone.now)

Rails使用ConnectionPool。因此,每个HTTP请求都将尝试从该池中的Connection获取,并且在完成连接后,连接不会关闭,而只会返回到该池。随着时间的流逝,Rails不会无限尝试打开连接。根据您的生产需求和数据库连接限制,在:pool中指定database.yml的大小。 :pool的大小是最大连接数,而不是连接数; Rails不会立即创建连接。仅根据需求。

但是,如果您有意在线程/请求期间不再使用Connection,并且想要立即将Connection放回池中,那么您可以简单地进行做ActiveRecord::Base.connection_pool.release_connection