Caching Coldfusion/Railo:What';输出文件内容最有效的方法是什么?fileRead还是include?

Caching Coldfusion/Railo:What';输出文件内容最有效的方法是什么?fileRead还是include?,caching,coldfusion,railo,Caching,Coldfusion,Railo,虽然我一直在缓存数据库调用并将常用数据放入内存以便更快地访问,但最近我发现简单的数据处理和输出可以为页面加载增加大量时间,因此我一直在开发一个模板缓存组件,该组件将解析的HTML保存到文件或内存中,以便更快地包含在页面上 这一切都很好,将一些页面负载降低到未缓存的10%——但是我发现自己想知道什么是输出内容最有效的方法 目前,我正在使用fileRead拉入解析后的HTML并保存到一个变量中,该变量在页面上输出。 这看起来很快,但我注意到Tomcat服务使用的内存在逐渐增加——可能是因为fileR

虽然我一直在缓存数据库调用并将常用数据放入内存以便更快地访问,但最近我发现简单的数据处理和输出可以为页面加载增加大量时间,因此我一直在开发一个模板缓存组件,该组件将解析的HTML保存到文件或内存中,以便更快地包含在页面上

这一切都很好,将一些页面负载降低到未缓存的10%——但是我发现自己想知道什么是输出内容最有效的方法

目前,我正在使用
fileRead
拉入解析后的HTML并保存到一个变量中,该变量在页面上输出。 这看起来很快,但我注意到Tomcat服务使用的内存在逐渐增加——可能是因为
fileRead
操作正在将内容读入内存,很可能Tomcat在完成时并没有删除这些数据

(旁白:有人知道我可以查询JVM内存并找到CF创建的对象的详细信息/堆栈跟踪的方法吗?)

或者,我可以使用
cfinclude
简单地包含解析后的HTML文件。从我能找到的所有信息来看,速度似乎是一样的——那么这种方法会更节省内存吗? 我以前在服务器上遇到过内存使用导致Tomcat崩溃的问题,因此将其关闭是非常重要的


有没有人做过类似的事情,可以让我从他们的经验中受益?

cfinclude只是将模板包含到正在编译的模板中,而fileread必须先将其读入内存,然后再输出,因此从技术上讲,它将消耗更多内存。我不知道;I don’我不认为速度会有很大的差异,但只要打开调试并检查执行时间,就可以看到差异。

最有效的方法是使用
cachePut()
缓存它,并从
cacheGet()提供服务。有什么比从RAM中获取更快?如果是整个页面,则根本不要使用正确的Expire头来获取它,或者巧妙地返回304表示未修改。

事实证明,CFInclude实际上将(在本例中已呈现)内容编译到一个类中,这本身就有开销。这些类没有被卸载(根据CFTracker),因此,太多的类会导致permgen错误。FileRead()的效率似乎要高出几个数量级,因为我们所做的只是将内容插入输出缓冲区。

我似乎在Railo上使用EHCache时遇到问题。。。在任何情况下,我仍然希望使用文件进行存储,因为服务器内存有问题,并且有数千项需要缓存。或者尝试SSD,然后文件读取应该非常快。我将很快转移到该系统上的SSD,但我的问题更多的是内存而不是速度。Railo有一个可扩展的缓存基础设施,允许您将项目缓存在进程外的位置,从而使您不必担心RAM。因此,您可以使用Henry的cachePut()和cacheGet()思想,但要指向外部缓存。这可以是memcached、外部EHCache或Couchbase集群。免责声明:我帮助为Couchbase编写了Railo的商业扩展。@Henry,如果驱动器是本地的,如果是网络连接的,那就太难了。进程外缓存的主要区别在于水平可伸缩性、故障切换和自动项目过期。如果堆在增加而不是下降,即使在运行完整GC之后,也要进行堆转储,以确定哪些内容没有从堆中收集。我不是Java开发人员,我从来没有真正掌握过这一点——我发现的所有指令都假设有很多Java知识。。。将Tomcat作为Windows服务运行似乎会使获取堆转储变得非常困难。Railo允许您通过cfadmin标记生成堆转储。有几种用于分析堆转储的工具,如Eclipse内存分析器工具(MAT)。如果您需要,还有CF调优公司可以帮助您解决此问题。这是非常有用的信息,谢谢!我无法想象为什么heapdump操作没有列在CFAdmin的文档中。唉,如果不深入了解Railo作为Java应用程序的内部结构,所提供的信息对我没有多大帮助。。。但能最终做到这一点真是太好了!Railo有意不记录cfadmin,因为他们希望最终将其封装在Admin CFC中,并且实现可能会在某个时候发生变化。同时,你必须看一下代码,或者当他们在邮件列表上谈论它时要注意:)事实上,看起来速度几乎是一样的-如果include方法不会像fileRead那样增加内存,我想这将是一种方式。我想我会回到这里更新。。。事实证明,CFInclude实际上将(在本例中已呈现)内容编译成一个类,而这个类本身就有开销。这些类没有被卸载(根据CFTracker),因此,许多类可能会导致permgen错误。FileRead()的效率似乎要高出几个数量级,因为我们所做的只是将内容插入输出缓冲区。