我正在运行Coldfusion8/MySQL 5.0.88
。
我的应用程序主要功能是搜索功能,在提交时会触发调用cfc-method的AJAX请求。该方法组装HTML,gzip并返回gzip压缩的HTML作为Ajax响应。
这是gzip部分:
<cfscript>
var result="";
var text=createObject("java","java.lang.String").init(arguments[1]);
var dataStream=createObject("java","java.io.ByteArrayOutputStream").init();
var compressDataStream=createObject("java","java.util.zip.GZIPOutputStream").init(dataStream);
compressDataStream.write(text.getBytes());
compressDataStream.finish();
compressDataStream.close();
</cfscript>
我对此处cfobject
的使用有点不情愿,特别是因为每个用户都会反复调用此脚本。
问题:
如果我在application
或session
级别创建对象,或者至少在重新创建对象之前检查对象是否存在,是否会提高性能?处理这个问题的最佳方法是什么?
答案 0 :(得分:5)
如果您对对象的使用与问题中的代码片段中的内容类似,那么我不会将任何内容置于任何比请求更长的范围内。原因是:
您实例化的对象不可重复使用(字符串是不可变的,输出流看起来也不可重复使用)
即使它们可以重复使用,相关对象也不是线程安全的。它们不能在并发请求之间共享,因此应用程序范围不合适,实际上会话范围可能不安全,因为同一会话的并发请求很容易发生。
你在那里使用的对象的创建成本可能非常低,所以如果可以的话,尝试缓存它们几乎没有什么好处。
如果你有真正资源密集型的对象,那么缓存和汇集这些对象是有意义的(例如数据库连接),但要做到这一点需要相当大的努力,所以你需要确保你首先需要它。