小编J.T*_*.T.的帖子

在ColdFusion中创建对象的行为

有一次,我有一个理论,即在每个请求上实例化对象而不是让它们驻留在Application范围内是一个巨大的记忆力.由于我对ColdFusion的了解多年来一直在增长,我认为我并不真正理解CF如何处理CF框架的"黑匣子"中的类,所以我将要求它进行社区更正或确认.

我只想抛弃我的想法:

  1. CFC被编译成一个类,该CFC中的每个方法都被编译成一个类.
  2. 这些类将驻留在(PermGen)内存中,并可根据CF管理员设置写入磁盘.
  3. 创建新对象或请求模板时,将对源代码进行哈希处理,并将其与编译类存储的哈希进行比较.
    1. 如果匹配,它将在内存中使用已编译的类
    2. 如果编译的类不存在,它将从源代码编译
    3. 如果编译的类存在,但哈希不匹配,则会重新编译.
  4. 另外,无论何时启用可信缓存,ColdFusion都不会对源进行哈希检查以检查差异,并将继续在内存中使用已编译的类.
  5. 无论何时创建新对象,都会获得一个指向已编译类及其方法类的新指针,并且伪构造函数中会出现任何运行时事件.编辑:此时,我指的是使用createObject并在函数运行之外使用任何"松散"代码.当我说指针时,我指的是为对象的作用域(这,变量,函数变量)分配的内存的引用.
  6. 如果您请求init,则构造函数将运行.此时消耗的内存只是新的引用和伪构造函数和构造函数中设置的任何变量.实际上,您并没有为整个班级的副本占用内存.编辑:对于这一步,我指的是使用new运算符或链接你的createObject().init()旧学校.

这消除了我个人多年来可能听到的巨大谬误,即在每个请求中实例化大型对象都是一个巨大的内存耗尽(由于拥有类的副本而不仅仅是引用).请注意,我并不赞成这一点,单身模式令人惊叹.我只是想确认一下发生了什么,以防止在遗留代码中追逐红色鲱鱼.

编辑:感谢大家的投入,这对我来说是一个非常有用的问答.

coldfusion

15
推荐指数
1
解决办法
1150
查看次数

了解ColdFusion中的持久HTTP连接

结论:我试图了解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)

coldfusion http

7
推荐指数
1
解决办法
1866
查看次数

ColdFusion执行时间准确度

我发现2004年的一个非常旧的线程报告了ColdFusion调试输出中列出的执行时间仅精确到16ms的事实.这意味着,当您打开调试输出并查看执行时间时,您会看到最接近的16ms的估计值.今天我可以用ACF10看到这个.刷新页面时,大多数时间在15-16ms的倍数之间反弹.

以下是问题:

  1. 从底部开始,当ColdFusion报告0ms或16ms时,这是否总是意味着在0到16之间,但不超过16ms?

  2. 当coldfusion报告32毫秒时,这是否意味着介于17和32之间?

  3. ColdFusion默认情况下单独列出所有内容,而不是作为执行树,其中调用者包含许多函数.当确定树上的执行成本更高时,它是否将子项的"不准确"时间相加,或者这是所有子进程执行的实际时间的实际成本?

  4. 我们可以使用cftimers或getTickCount()来实际获得准确的时间,还是这些也是估计?

  5. 有时,你会看到3个函数每个花费4毫秒,总共12毫秒,甚至一个呼叫花费7毫秒.为什么它有时看起来"准确?"

我现在将提供一些猜测,但我想得到一些社区支持!

  1. ColdFusion将跟踪报告准确到16ms的过程总时间,而不是总结子进程.

  2. cftimers和getTickCount()更准确.

  3. 我不知道?

coldfusion

7
推荐指数
1
解决办法
1205
查看次数

SQL计划编译和真值表

如果我有 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有效地将左连接转换为内连接.这是我的行为最初预期.当这个过滤器实际工作时我很惊讶.

sql sql-server null left-join

7
推荐指数
1
解决办法
305
查看次数

范围访问CFM与CFC的性能

我知道这个问题可能有点学术性,但我只是想在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)

coldfusion

5
推荐指数
1
解决办法
185
查看次数

MVEL和Elasticsearch的布尔值脚本问题

我有一个字段映射定义为

{ "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查询中,它们都获得提升,就好像它们具有真值一样.

mvel elasticsearch

4
推荐指数
1
解决办法
1433
查看次数

防止ColdFusion发送电子邮件

即使在cfmail标记中使用了服务器和凭据,我也希望禁用在我们的开发服务器上发送的所有电子邮件.我希望消息进入假脱机无法送达,以便我们可以阅读它们.

这是在Windows上.

编辑 - 为什么?我们目前在admin中将邮件服务器设置为虚拟邮件,但我们在各种邮件标签上指定了许多服务器.由于开发人员意外发送邮件而被烧毁,我们想完全禁用它.

coldfusion firewall cfmail

2
推荐指数
2
解决办法
1032
查看次数

如何在ColdFusion(tomcat)中使用Java Mission Control(或其他解决方案)

ColdFusion监视器非常适合有关服务器本身的详细信息,但在涉及JVM时它非常有限.

在开发和测试应用程序和功能的性能/内存占用时,如何实现Java Mission Control或类似的JVM监视解决方案来监视运行ColdFusion的JVM?

请注意,我要求的"社区知识"这个问题,并已经知道答案,但随时贡献约其他监控解决方案的任何花絮.

coldfusion

1
推荐指数
1
解决办法
1871
查看次数

标签 统计

coldfusion ×6

cfmail ×1

elasticsearch ×1

firewall ×1

http ×1

left-join ×1

mvel ×1

null ×1

sql ×1

sql-server ×1