我正在运行Coldfusion8/MySQL 5.0.88
。
我的应用程序的主要功能是一个搜索函数,它在提交时触发一个调用cfc方法的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
级别上创建对象,或者在重新创建对象之前至少检查对象的存在,这会提高性能吗?处理此问题的最佳方法是什么?
如果您对对象的使用与问题中的代码片段中的内容类似,那么我不会将任何内容放入比请求寿命更长的范围中。原因是:
-
正在实例化的对象是不可重用的(字符串是不可变的,输出流看起来也不可重用)
-
即使这些对象是可重用的,它们也不是线程安全的。它们不能在并发请求之间共享,因此应用程序范围不合适,实际上会话范围可能也不安全,因为同一会话的并发请求很容易发生。
-
您在那里使用的对象创建开销可能很低,所以如果可以的话,尝试缓存它们几乎没有什么好处。
如果您有真正资源密集型的对象,那么缓存和池化它们是有意义的(例如数据库连接),但要做到这一点需要付出相当大的努力,所以您需要确保首先需要它。