有一次,我有一个理论,即在每个请求上实例化对象而不是让它们驻留在Application范围内是一个巨大的记忆力.由于我对ColdFusion的了解多年来一直在增长,我认为我并不真正理解CF如何处理CF框架的"黑匣子"中的类,所以我将要求它进行社区更正或确认.
我只想抛弃我的想法:
这消除了我个人多年来可能听到的巨大谬误,即在每个请求中实例化大型对象都是一个巨大的内存耗尽(由于拥有类的副本而不仅仅是引用).请注意,我并不赞成这一点,单身模式令人惊叹.我只是想确认一下发生了什么,以防止在遗留代码中追逐红色鲱鱼.
编辑:感谢大家的投入,这对我来说是一个非常有用的问答.
结论:我试图了解ColdFusion是否能够通过CFHTTP标签在单个请求之外使用持久性http连接.这篇文章的一部分是"我发现/尝试了什么".
我的系统:CF10 IIS7.5 Windows 7
我目前正在通过HTTP Rest接口连接到ElasticSearch,该接口将具有大量的cfhttp调用.在这种情况下,ColdFusion是Client,ElasticSearch是服务器.按照建议,我传递了keep-alive标头以及cfhttp请求,但发现CFHTTP似乎总是在它之后添加一个关闭,从而产生这个标头:
<!--- Calling tag --->
<cfhttp url="loc.mysite.com?endpoint"
method="POST"
result="ret">
<cfhttpparam type="HEADER" name="Keep-Alive" value="300">
<cfhttpparam type="HEADER" name="Connection" value="keep-alive">
<cfhttpparam type="xml" value="#body#" />
</cfhttp>
<!--- Results in this header. (dumping getHTTPrequestdata() on a dummy page) --->
connection: keep-alive,closed
Run Code Online (Sandbox Code Playgroud)
首先,我无法弄清楚如何防止发生关闭.
其次,我无法弄清楚ColdFusion是否会重复使用该连接,即使它是在同一请求期间或在此请求之外没有关闭的情况下发送的.显然,这与Java在这一点上与OS的交互方式有关.最初,我认为它将由ColdFusion的魔力处理,但我开始认为它没有使用任何花哨的Java池魔法.
第三,我在ColdFusion中找不到关于http连接池的任何文档.它确实有数据库连接池,但http池可能是一个相对较新的要求.
第四,我发现CFX_http5仍然在使用Tomcat的ColdFusion 10中工作(有什么机会).虽然它擅长多线程请求,但很少提及如何使用keep-alive.没有购买,我无法在循环内测试它.它不会添加关闭标头.它像我期望的那样保持活着.
第六次(自首次发布以来编辑很多)第六,Windows有一个默认数量的临时或"短暂"端口,它可以利用它来产生新的出站TCP连接.默认情况下,一旦打开一个连接,Windows将使其保持活动状态两分钟(尽管它刚刚被放弃并占用了空间).这是一个TCP配置,因此http标头不会直接在这里播放.可用端口的默认数量为5,000个,减少1024个= 3076个端口.这意味着一个盒子上的所有ColdFusion实例在任何给定的两分钟窗口中最多可以产生3076个http请求,而不会在可用的连接端口上等待.如果太多请求被淹没(我不知道在什么时候),您将收到"连接已关闭"错误.这让我想起原始级别的垃圾收集.所以,
更新:CFX_HTTP5确实支持单个ColdFusion请求中预期的保持活动和持久连接.我的ElasticSearch端点的150K查询测试先前在15分钟内完成.使用CFX_HTTP5,它在4分钟内运行.此外,我能够将注册表切换回默认端口数.下一步是弄清楚HTTPComponents是否有效.我有这个几乎工作.
更新2 ::使用下面建议的HTTP组件构建自定义http调用.我使用了默认设置的基本连接池管理器.我还没试过调整它.这个过程在5分钟内结束,比cfx_http5慢一点,但仍然比cfhttp快很多.另外,我还没有完成涉及多个ColdFusion请求的测试来真正测试连接池.
更新3:我确认HTTPComponents确实正在建立一个合适的连接池.但是,由此有责任正确管理这些连接和池本身,以确保它是系统资源的良好管理者.我能够从几个不同的同时请求中运行数百万个HTTP请求,同时只打开少量的HTTP连接.从日志中,我能够看到有多少连接正在使用,空闲或旋转.这真的不是那么多代码,项目背后的人都有很棒的文档.
HTTPComponents Connection Pool:
Single request, unlimited CFHTTP to same connection = single open TCP connection
N-requests = <N open TCP connections.
CFHTTP
N-CFHTTP calls …Run Code Online (Sandbox Code Playgroud) 我发现2004年的一个非常旧的线程报告了ColdFusion调试输出中列出的执行时间仅精确到16ms的事实.这意味着,当您打开调试输出并查看执行时间时,您会看到最接近的16ms的估计值.今天我可以用ACF10看到这个.刷新页面时,大多数时间在15-16ms的倍数之间反弹.
以下是问题:
从底部开始,当ColdFusion报告0ms或16ms时,这是否总是意味着在0到16之间,但不超过16ms?
当coldfusion报告32毫秒时,这是否意味着介于17和32之间?
ColdFusion默认情况下单独列出所有内容,而不是作为执行树,其中调用者包含许多函数.当确定树上的执行成本更高时,它是否将子项的"不准确"时间相加,或者这是所有子进程执行的实际时间的实际成本?
我们可以使用cftimers或getTickCount()来实际获得准确的时间,还是这些也是估计?
有时,你会看到3个函数每个花费4毫秒,总共12毫秒,甚至一个呼叫花费7毫秒.为什么它有时看起来"准确?"
我现在将提供一些猜测,但我想得到一些社区支持!
是
是
ColdFusion将跟踪报告准确到16ms的过程总时间,而不是总结子进程.
cftimers和getTickCount()更准确.
我不知道?
如果我有 NOT ( 1 <> 1 AND NULL <> 1 )
我可以看到SQL将其转化为执行计划XML: ( 1 = 1 OR NULL = 1)
如果你真的要评估前面的表达式,那么True AND Null它将是Null并将消除该行.但是,由于OR,编译后的表达式可以返回一行.
我可以假设这种类型的编译始终保证会发生吗?SQL Server永远不会尝试将复杂的逻辑推进到编译计划中?有关于此的一些文件吗?
这篇文章非常有用,但我只是错过了一个难题:https: //www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -逻辑/
这是一个SQL示例
SELECT 1
FROM T T
LEFT JOIN T2 T2 --t2 has zero rows
ON T.id = t2.t_id
WHERE NOT ( T.id <> 99 AND T2.id <> 99 )
Run Code Online (Sandbox Code Playgroud)
根据我的SQL经验,我知道在正常情况下(没有短路评估)T2.id <> 99有效地将左连接转换为内连接.这是我的行为是最初预期.当这个过滤器实际工作时我很惊讶.
我知道这个问题可能有点学术性,但我只是想在ColdFusion中理解这种行为.
在CFM上访问REQUEST范围时,比在方法中访问REQUEST范围花费的时间更少.在我查看我的.class文件时,唯一的区别是,在方法内部,它必须引用CFPage参数来访问structKeyExists()方法以检查REQUEST范围.另外,另一个奇怪的是,访问THIS范围比访问CFC中的方法中的VARIABLES范围更快.
有谁知道为什么会这样?
index.cfm
<cfscript>
tests = new tests();
request.test = {
"foo":[1]
};
iterations = 10000;
starttime = getTickCount();
for( i=1; i<=iterations; i++){
if( structKeyExists( request, "test" ) ){
request.test.foo[1];
}
}
writeoutput( "REQUEST scope access on CFM: " & getTickCount()-starttime & "<br>" );
tests.test( iterations ) ;
</cfscript>
Run Code Online (Sandbox Code Playgroud)
Test.cfc
component{
function test( iterations ) {
// test variables
variables.testvar = {foo : [1]};
this.testvar = {foo : [1]};
var startTime = getTickCount();
for( var i=1; i<=iterations; i++){
if( …Run Code Online (Sandbox Code Playgroud) 我有一个字段映射定义为
{ "top_seller":{ "类型": "布尔"}}
在我的查询中,我正在尝试根据布尔值进行自定义分数查询.我把头发拉了出来.每次我运行这样的脚本:
return if(doc['top_seller'].value==true) {10} else {0}
Run Code Online (Sandbox Code Playgroud)
每一份文件都获得了真正的10次提升.只有1%的文档被设置为TRUE.我试过没有== true,= ='true'.我试过三元..DOC [ 'top_seller']值== TRUE 10:0.我尝试过1/0而不是true/false.
我甚至做了一个实验,在那里我创建了一个新的索引,并使用一个true和一个false文档进行输入.在match_all查询中,它们都获得提升,就好像它们具有真值一样.
即使在cfmail标记中使用了服务器和凭据,我也希望禁用在我们的开发服务器上发送的所有电子邮件.我希望消息进入假脱机无法送达,以便我们可以阅读它们.
这是在Windows上.
编辑 - 为什么?我们目前在admin中将邮件服务器设置为虚拟邮件,但我们在各种邮件标签上指定了许多服务器.由于开发人员意外发送邮件而被烧毁,我们想完全禁用它.
ColdFusion监视器非常适合有关服务器本身的详细信息,但在涉及JVM时它非常有限.
在开发和测试应用程序和功能的性能/内存占用时,如何实现Java Mission Control或类似的JVM监视解决方案来监视运行ColdFusion的JVM?
请注意,我要求的"社区知识"这个问题,并已经知道答案,但随时贡献约其他监控解决方案的任何花絮.