在模型中执行添加连接
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
有点不同。他们是一样的吗?
答案 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