是否可以将大型对象(例如 java 组件)存储在 Application 变量中?
-
27-09-2019 - |
题
我现在正在开发一个应用程序,它在应用程序范围内创建并存储与本地 XMPP 服务器的连接。连接方法存储在 cfc 中,确保每次使用 Application.XMPPConnection 时都已连接并获得授权,并利用该连接向用户发送实时事件。据我所知,这工作正常。但它还没有在任何压力下进行过测试。
我的问题是: 这样设置以后会不会出现问题? 我之所以这么问,是因为我找不到其他人以这种方式使用应用程序变量的证据。如果我不使用 Railo,我会使用 CF 的事件网关来完成相同的任务。
解决方案
尺寸本身不是问题。如果你要初始化每个请求一个对象,你会燃烧大量的内存。问题是访问。
如果您有大量的同一对象的竞争要求,你需要测量该对象与实例的访问时间。请记住,对于数据对象,多个线程可以阅读它们。我的理解,不过,是当一个对象的函数被调用时,它锁定该对象到其他线程,直到函数返回。
此外,如果物体保持状态,你需要考虑当多个线程越来越/设置这些数据做什么。你最终会与竞争条件?
您可以考虑在session范围内处理这个对象,所以它只是每个用户(谁,有可能的,只会让一个或两个同时请求)实例化。
其他提示
当然,如果应用程序不同部分的所有用户都使用这些组件,您可以使用应用程序范围来存储这些组件。现在,可能的问题是:
- 组件的尺寸
- 如果在应用程序启动期间设置这些,则初始化所需的时间
- 设置/获取这些组件的状态之间的竞争条件
首先,有多种方法可以计算内存中组件的大小。最近有很多关于这个主题的帖子,所以很容易找到一些。如果您没有保存一些大型结构或查询,我想您在这里没问题。
其次,如果您没有使用数据库中的一些大型查询来填充此 cfc 或进行一些缓慢的解析,那么您在这里也可以。
第三,注意可能出现的情况,即更多用户正在更改这些组件的状态。如果是这样,请对组件状态的每个设置使用 cflock。
不隶属于 StackOverflow