我有两段代码基本上做同样的事情。我以两种不同的方式填充数据表。他们是:
<h:dataTable binding="#{currentUser.ITEMS}" style=" width:505px;" id="userTable" value="#{currentUser.items}" var="user" >
<h:column>
</h:column>
<h:column>
<f:facet name="header">Account Number</f:facet>
#{user.name}
</h:column>
<h:column>
<f:facet name="header">Currency</f:facet>
#{user.surname}
</h:column>
</h:dataTable>
其中 items 是包含用户项目的数组,currentUser 是 User 类型的 session 范围类对象。在第一个代码中,当用户登录时,我从数据库中获取它的所有项目,并将它们添加到 session 中以备后用,因为我以这种方式填充表格。现在是第二个版本:
<h:dataTable binding="#{user.ITEMS}" style=" width:505px;" id="userTable" value="#{user.items}" var="user" >
<h:column>
</h:column>
<h:column>
<f:facet name="header">Account Number</f:facet>
#{user.name}
</h:column>
<h:column>
<f:facet name="header">Currency</f:facet>
#{user.surname}
</h:column>
</h:dataTable>
在第二个例子中,当用户登录系统时,我不保留项目列表,但每当要填充一个表时,我都会查询数据库并根据用户的项目填充表。
所以我的问题是,哪种方式更好?我看到在第一种情况下使用大量 session 对象可能有害,但在第二种情况下每次我们需要项目信息时我们都会进行数据库搜索。那么我们可以说一种方式在空间、时间等方面优于另一种方式吗?
最佳答案
在 session 范围对象中缓存数据有提供陈旧数据的风险 - 如果另一个进程修改了数据库的内容,那么 session 范围对象将不会反射(reflect)这些更改。不过,这听起来不像是可变数据,在这种情况下这不是问题。
除此之外,在 session 范围对象中缓存数据可能在时间上更好,因为数据保存在主内存中,并且每次访问数据库在空间上可能更好,因为你没有保留内存中的数据。存在“可能”限定符是因为数据库可能正在为您缓存此数据。
关于database - 哪个更好? - 每次查询数据库或将对象保持在 session 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17582606/