2

我有两段代码基本上做同样的事情。我以两种不同的方式填充数据表。他们是这样的:

<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 类型的会话范围类对象。在第一个代码中,当用户登录时,我从数据库中获取其所有项目,并将它们添加到会话以供以后使用,因为我以这种方式填充表。现在是第二个版本:

<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>

在第二个示例中,当用户登录系统时,我不保留项目列表,但是每当要填充表时,我都会进行数据库查询并按用户的项目填充表。

所以我的问题是,哪种方式更好?我看到在第一种情况下使用大量会话对象可能是有害的,但在第二种情况下,每次我们需要项目信息时,我们都会进行数据库搜索。那么我们可以说一种方式在空间、时间等方面优于另一种方式吗?

4

1 回答 1

6

在会话范围的对象中缓存数据存在提供过时数据的风险——如果另一个进程修改了数据库的内容,那么会话范围的对象将不会反映这些更改。不过,这听起来不像是可变数据,在这种情况下这不是问题。

除此之外,在会话范围对象中缓存数据可能会在时间方面更好,因为数据保存在主内存中,并且每次访问数据库在空间方面可能会更好,因为您没有将数据保存在记忆。有“可能”限定词是因为数据库可能正在为您缓存这些数据。

于 2013-07-10T23:33:36.690 回答