Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
8b451e3a
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8b451e3a
编写于
3月 26, 2015
作者:
R
Rafael Mendonça França
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #18846 from hundredwatt/feat/warn-on-result-set-size
Add `config.active_record.warn_on_result_set_size` option
上级
83429b1e
4d6fbe29
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
102 addition
and
0 deletion
+102
-0
activerecord/CHANGELOG.md
activerecord/CHANGELOG.md
+7
-0
activerecord/lib/active_record/core.rb
activerecord/lib/active_record/core.rb
+9
-0
activerecord/lib/active_record/railtie.rb
activerecord/lib/active_record/railtie.rb
+8
-0
activerecord/lib/active_record/relation/record_fetch_warning.rb
...record/lib/active_record/relation/record_fetch_warning.rb
+50
-0
activerecord/test/cases/relation/record_fetch_warning_test.rb
...verecord/test/cases/relation/record_fetch_warning_test.rb
+28
-0
未找到文件。
activerecord/CHANGELOG.md
浏览文件 @
8b451e3a
*
Add
`config.active_record.warn_on_records_fetched_greater_than`
option
When set to an integer, a warning will be logged whenever a result set
larger than the specified size is returned by a query. Fixes #16463
*Jason Nochlin*
*
Ignore psqlrc when loading database structure.
*Jason Weathered*
...
...
activerecord/lib/active_record/core.rb
浏览文件 @
8b451e3a
...
...
@@ -94,6 +94,15 @@ def self.configurations
mattr_accessor
:dump_schemas
,
instance_writer:
false
self
.
dump_schemas
=
:schema_search_path
##
# :singleton-method:
# Specify a threshold for the size of query result sets. If the
# number of records in the set exceeds threshold, a warning is
# logged. This should be used to identify queries which pull
# thousands of records, which may cause memory bloat.
mattr_accessor
:warn_on_records_fetched_greater_than
,
instance_writer:
false
self
.
warn_on_records_fetched_greater_than
=
nil
mattr_accessor
:maintain_test_schema
,
instance_accessor:
false
mattr_accessor
:belongs_to_required_by_default
,
instance_accessor:
false
...
...
activerecord/lib/active_record/railtie.rb
浏览文件 @
8b451e3a
...
...
@@ -102,6 +102,14 @@ class Railtie < Rails::Railtie # :nodoc:
end
end
initializer
"active_record.warn_on_records_fetched_greater_than"
do
if
config
.
active_record
.
warn_on_records_fetched_greater_than
ActiveSupport
.
on_load
(
:active_record
)
do
require
'active_record/relation/record_fetch_warning'
end
end
end
initializer
"active_record.set_configs"
do
|
app
|
ActiveSupport
.
on_load
(
:active_record
)
do
app
.
config
.
active_record
.
each
do
|
k
,
v
|
...
...
activerecord/lib/active_record/relation/record_fetch_warning.rb
0 → 100644
浏览文件 @
8b451e3a
module
ActiveRecord
class
Relation
module
RecordFetchWarning
# When this module is prepended to ActiveRecord::Relation and
# `config.active_record.warn_on_records_fetched_greater_than` is
# set to an integer, if the number of records a query returns is
# greater than the value of `warn_on_records_fetched_greater_than`,
# a warning is logged. This allows for the dection of queries that
# return a large number of records, which could cause memory
# bloat.
#
# In most cases, fetching large number of records can be performed
# efficiently using the ActiveRecord::Batches methods.
# See active_record/lib/relation/batches.rb for more information.
def
exec_queries
QueryRegistry
.
reset
super
.
tap
do
if
logger
&&
warn_on_records_fetched_greater_than
if
@records
.
length
>
warn_on_records_fetched_greater_than
logger
.
warn
"Query fetched
#{
@records
.
size
}
#{
@klass
}
records:
#{
QueryRegistry
.
queries
.
join
(
";"
)
}
"
end
end
end
end
ActiveSupport
::
Notifications
.
subscribe
(
"sql.active_record"
)
do
|*
args
|
payload
=
args
.
last
QueryRegistry
.
queries
<<
payload
[
:sql
]
end
class
QueryRegistry
# :nodoc:
extend
ActiveSupport
::
PerThreadRegistry
attr_accessor
:queries
def
initialize
reset
end
def
reset
@queries
=
[]
end
end
end
end
end
ActiveRecord
::
Relation
.
prepend
ActiveRecord
::
Relation
::
RecordFetchWarning
activerecord/test/cases/relation/record_fetch_warning_test.rb
0 → 100644
浏览文件 @
8b451e3a
require
'cases/helper'
require
'models/post'
module
ActiveRecord
class
RecordFetchWarningTest
<
ActiveRecord
::
TestCase
fixtures
:posts
def
test_warn_on_records_fetched_greater_than
original_logger
=
ActiveRecord
::
Base
.
logger
orginal_warn_on_records_fetched_greater_than
=
ActiveRecord
::
Base
.
warn_on_records_fetched_greater_than
log
=
StringIO
.
new
ActiveRecord
::
Base
.
logger
=
ActiveSupport
::
Logger
.
new
(
log
)
ActiveRecord
::
Base
.
logger
.
level
=
Logger
::
WARN
require
'active_record/relation/record_fetch_warning'
ActiveRecord
::
Base
.
warn_on_records_fetched_greater_than
=
1
Post
.
all
.
to_a
assert_match
(
/Query fetched/
,
log
.
string
)
ensure
ActiveRecord
::
Base
.
logger
=
original_logger
ActiveRecord
::
Base
.
warn_on_records_fetched_greater_than
=
orginal_warn_on_records_fetched_greater_than
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录