1

我在跑步Coldfusion8/MySQL 5.0.88

我的应用程序的主要功能是一个搜索功能,它在提交时会触发一个调用 cfc 方法的 AJAX 请求。该方法组装 HTML,将其压缩并返回压缩后的 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这里的使用有点不情愿,特别是因为每个用户都会一遍又一遍地调用这个脚本。

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

4

1 回答 1

5

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

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

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

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

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

于 2012-09-04T08:19:02.337 回答