我正在设计一个 Web 应用程序,它应该保留包含大量信息的用户个人资料,显然它从数据库中读取数据。
目前,我的会话中有用户名,每次我需要用户信息时都应该读取会话,然后创建配置文件类的对象(再次从数据库中读取数据)来检索用户信息,这是解决此类问题的最佳做法吗?
这是性能和内存消耗之间的典型权衡。如果您想要一个快速的应用程序,请将整个用户配置文件保存在 HTTP 会话中,但要确保您的服务器中有足够的内存。
如果您想保持较低的资源消耗,请在会话中仅存储用户 ID,并在每次需要时从数据库中加载它。这也使集群更简单,因为要迁移的数据更少。
合理的妥协是使用后一种方法和一些缓存。这样,热用户(当前正在使用系统)被保存在内存中,而空闲用户或不经常访问的新页面被从缓存中清除(假设缓存小于 HTTP 会话的数量)。
同意 Obe6 的响应,最佳做法是确保配置文件不在会话中,然后从数据源中检索,然后将其附加到会话中。
当会话无效时,所有信息都会从会话中删除。IBM 有一篇很好的文章。 http://www.ibm.com/developerworks/websphere/library/bestpractices/store_objects_in_httpsession.html
通常,“最佳实践”是在会话中维护用户配置文件数据,并仅在第一次从数据库中加载所有需要的信息。
换句话说,Profile
在你的 http 会话中维护一个类的实例(必须实现Serializable
)。Profile 必须包含所有使用频率更高的信息。
请注意,“读取会话”就像读取 HashMap(因此在性能方面具有最低成本)。当HttpSession
到期时,Profile 将被垃圾收集。
更新(根据您的评论):
要计算(或查找)活跃用户(其他都是非活跃用户),一个典型的解决方案是Profile
实现HttpSessionBindingListener
接口。当Profile
绑定到会话时,会收到通知,因此您可以增加静态计数器(例如 Profile 类的静态属性),并且可以在Profile
未绑定时减少它(以编程方式未绑定或因为其会话已过期)
Session is generally a good enough place to keep the user profile data. You need to quantify how much of data you are talking here. Let's say its 5KB per session, then, you could store up to 20000 user profile in memory using 100 MB of RAM. You can allocate heap to JVM accordingly based on the max. number of active sessions you expect on your site.
This is just one aspect. When you plan to scale the app by adding more app servers, then, you can even think of moving the sessions out to a out-of-process cache/memory stores such as memcached.
If all the user profile data you keep in session does not get rendered on each page, then, it may be a good idea only to keep bare minimum in session and fetch other data as per need.