应该在Coldfusion中的应用程序/会话级别上创建大量使用的对象吗



我正在运行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,尤其是因为每个用户都会一遍又一遍地调用这个脚本。

问题:
如果我在applicationsession级别上创建对象,或者在重新创建对象之前至少检查对象的存在,这会提高性能吗?处理此问题的最佳方法是什么?

如果您对对象的使用与问题中的代码片段中的内容类似,那么我不会将任何内容放入比请求寿命更长的范围中。原因是:

  • 正在实例化的对象是不可重用的(字符串是不可变的,输出流看起来也不可重用)

  • 即使这些对象是可重用的,它们也不是线程安全的。它们不能在并发请求之间共享,因此应用程序范围不合适,实际上会话范围可能也不安全,因为同一会话的并发请求很容易发生。

  • 您在那里使用的对象创建开销可能很低,所以如果可以的话,尝试缓存它们几乎没有什么好处。

如果您有真正资源密集型的对象,那么缓存和池化它们是有意义的(例如数据库连接),但要做到这一点需要付出相当大的努力,所以您需要确保首先需要它。

最新更新