可以在Application变量中存储大对象(例如java组件)吗?

时间:2010-05-17 17:26:36

标签: coldfusion railo cfwheels cfml

我正在开发一个应用程序,它创建并存储与应用程序范围内的本地XMPP服务器的连接。连接方法存储在cfc中,以确保Application.XMPPConnection在每次使用时都已连接并授权,并利用连接向用户发送实时事件。据我所知,这工作正常。但它没有在任何压力下进行测试。

我的问题是:此设置会在以后导致问题吗?我只是问,因为我找不到其他人以这种方式使用应用程序变量的证据。如果我没有使用铁路,我将使用CF的事件网关来完成相同的任务。

2 个答案:

答案 0 :(得分:7)

尺寸本身不是问题。如果您要为每个请求初始化一个对象,则会消耗更多内存。问题是访问。

如果您有大量请求竞争同一对象,则需要测量该对象与实例化的访问时间。请记住,对于数据对象,多个线程可以读取它们。但我的理解是,当调用一个对象的函数时,它会将该对象锁定到其他线程,直到该函数返回。

此外,如果对象维护状态,则需要考虑在多个线程获取/设置该数据时要执行的操作。你最终会遇到竞争条件吗?

您可以考虑在会话范围中处理此对象,以便它仅针对每个用户进行实例化(可能只会生成一个或两个同时请求)。

答案 1 :(得分:3)

当然,如果应用程序的不同部分中的所有用户都使用这些组件,则可以使用应用程序范围来存储这些组件。 现在,可能的问题是:

  1. 组件的大小
  2. 如果在应用程序启动期间设置了
  3. 初始化所需的时间
  4. 在这些组件的设置/获取状态之间竞争
  5. 首先,有一些方法可以计算内存中组件的大小。最近有很多关于这个主题的帖子,所以很容易找到一些。如果你没有保存一些大型结构或查询,我想你在这里很好。

    第二,再次,如果你没有用数据库中的一些大型查询来填充这个cfc或者做一些缓慢的解析,那么你也可以。

    第三,注意可能的情况,更多用户正在改变这些组件的状态。如果是这样,请在组件的每个设置上使用cflock状态。