我正在设计一个Web应用程序,它应该保留用户的配置文件,其中包含大量信息, 显然它从数据库中读取数据。
目前,我的会话中有用户名,每次我需要用户的信息应该读取会话然后创建一个profile类的对象(再次从数据库读取数据)来检索用户的信息,这是最好的做法这样的问题?
答案 0 :(得分:1)
通常,“最佳实践”是在会话中维护用户配置文件数据,并且仅在数据库中第一次加载所有需要的信息。
换句话说,在http会话中保留Profile
类的实例(必须实现Serializable
)。配置文件必须包含更频繁使用的所有信息。
请注意,“阅读会话”就像阅读HashMap(因此在演出方面具有最低成本)。
当HttpSession
到期时,个人资料将被垃圾收集。
更新(根据您的意见):
计算(或查找)活动用户(所有其他用户都处于非活动状态),典型的解决方案是make Profile
实现HttpSessionBindingListener
接口。当Profile
绑定到会话时,会通知,因此您可以递增静态计数器(例如,Profile类的静态属性),并且可以在Profile
未绑定时递减它(以编程方式绑定)或者因为它的会话已经过期了)
答案 1 :(得分:1)
这是性能和内存消耗之间的典型交易。如果您想要快速应用程序,请将整个用户配置文件保留在HTTP会话中,但要确保服务器中有足够的内存。
如果要保持较低的资源消耗,请仅在会话中存储用户ID,并在每次需要时从数据库加载它。这也使得群集更简单,因为迁移的数据更少。
合理的妥协是使用后一种方法进行一些缓存。这种方式热用户(当前正在使用系统)保存在内存中,而空闲用户或不经常访问新页面则从缓存中清除(假设缓存小于HTTP会话的数量)。
答案 2 :(得分:1)
同意Obe6的回应, 最佳做法是确保配置文件不在会话中,然后从数据源中检索,然后将其附加到会话。
当会话无效时,会从会话中删除所有信息。 IBM提供了一篇很好的文章。 http://www.ibm.com/developerworks/websphere/library/bestpractices/store_objects_in_httpsession.html
答案 3 :(得分:0)
会话通常是保存用户个人资料数据的好地方。您需要量化您在这里谈论的数据量。假设每个会话为5KB,那么,您可以使用100 MB的RAM在内存中存储多达20000个用户配置文件。您可以根据最大值将堆分配给JVM。您期望在您的网站上活跃会话的数量。
这只是一个方面。当您计划通过添加更多应用服务器来扩展应用程序时,您甚至可以考虑将会话移动到进程外缓存/内存存储库,例如memcached。
如果您在会话中保留的所有用户个人资料数据都没有在每个页面上呈现,那么,最好只在会话中保持最低限度并根据需要获取其他数据。