【问题标题】:JSF2 Richfaces 4.3.1, walk method is called many time while using ExtendedDataModel and ArrangeableJSF2 Richfaces 4.3.1,使用ExtendedDataModel和Arrangeable时多次调用walk方法
【发布时间】:2013-04-03 08:11:26
【问题描述】:

我正在尝试加载带有分页和排序的数据表。使用 ExtendedDataModel 和 Arrangeable 来实现这一点,它工作正常。 然后我添加了 Phase Listener 来检查行为并注意到

1。分页工作正常,只有一个 DB Hit。
2。但是,虽然 Sorting DB Hit 发生了两次,第一次在第 2 阶段,第二次在第 6 阶段。

另请注意,如果我没有立即 =“true”,则 DB HIT 在第 2、3、4 和 6 阶段各发生 4 次。

我不确定为什么会这样。你能帮忙吗?

xhtml sn-p

                <rich:column sortBy="#{item.busName}" sortOrder="#{sortBean.order}">
                    <f:facet name="header">
                        <a4j:commandLink value="BUSINESS NAME" action="#{sortBean.sortByBus}" immediate="true"
                             render="riskData" />
                    </f:facet>
                    <h:outputText value="#{item.busName}">
                    </h:outputText>
                </rich:column>

                <rich:column sortBy="#{item.regionName}" sortOrder="#{sortBean.orderRegion}">
                    <f:facet name="header">
                        <a4j:commandLink value="REGION NAME"
                             action="#{sortBean.sortByRegion}"  immediate="true"
                             render="riskData" />
                    </f:facet>
                    <h:outputText value="#{item.regionName}">
                    </h:outputText>
                </rich:column>

---------带有 SYSOUTS 的阶段侦听器日志----------

具有未排序值的页面初始视图只有一个 DB HIT 来获取数据###

开始阶段 RESTORE_VIEW 1
结束阶段 RESTORE_VIEW 1
开始阶段 RENDER_RESPONSE 6
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排不可用
总计数 DB HIT
数据创建
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排不可用
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
结束阶段 RENDER_RESPONSE 6


BusinessName Unsorted Ascending Sort 有两个 DB HIT -> 第一个在 Phase2 和第二个在 Phase 6 ###

开始阶段 RESTORE_VIEW 1
结束阶段 RESTORE_VIEW 1
开始阶段 APPLY_REQUEST_VALUES 2
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排不可用
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
对业务排序 -> 切换 -> 降序到升序
设置排序 -> 订单业务 -> 升序
设置排序 -> 订单 PolicyDt -> 未排序
设置排序 -> 排序区域 -> 未排序
END PHASE APPLY_REQUEST_VALUES 2
开始阶段 RENDER_RESPONSE 6
获取排序 -> 订单业务 -> 升序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/test.xhtml @53,74 sortBy="#{item.busName}"升序
获取排序 -> 订单业务 -> 升序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/test.xhtml @53,74 sortBy="#{item.busName}"升序
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
步行 -> 结束
结束阶段 RENDER_RESPONSE 6

BusinessName 升序到降序 -> 在 Phase2 中有两个 DB HIT,第 2 个在 Phase2 ###

开始阶段 RESTORE_VIEW 1
结束阶段 RESTORE_VIEW 1
开始阶段 APPLY_REQUEST_VALUES 2
获取排序 -> 订单业务 -> 升序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/test.xhtml @53,74 sortBy="#{item.busName}"升序
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
排序列表之前
排序后 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
步行 -> 结束
对业务排序 -> 切换 -> 从升序到降序
设置排序 -> 订单业务 -> 降序
设置排序 -> 订单 PolicyDt -> 未排序
设置排序 -> 排序区域 -> 未排序
END PHASE APPLY_REQUEST_VALUES 2
开始阶段 RENDER_RESPONSE 6
获取排序 -> 订单业务 -> 降序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/test.xhtml @53,74 sortBy="#{item.busName}"降序
获取排序 -> 订单业务 -> 降序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/test.xhtml @53,74 sortBy="#{item.busName}"降序
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
结束阶段 RENDER_RESPONSE 6

删除立即数,然后对业务名称进行排序,在 Phase2、3、4 和 6 中各有四个 DB HIT

开始阶段 RESTORE_VIEW 1
结束阶段 RESTORE_VIEW 1
开始阶段 APPLY_REQUEST_VALUES 2
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 未排序
获取排序 -> 订单策略Dt -> 未排序
安排不可用
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
END PHASE APPLY_REQUEST_VALUES 2
开始阶段 PROCESS_VALIDATIONS 3
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
结束阶段 PROCESS_VALIDATIONS 3
开始阶段 UPDATE_MODEL_VALUES 4
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
结束阶段 UPDATE_MODEL_VALUES 4
开始阶段 INVOKE_APPLICATION 5
排序区域->切换->降序到升序
设置排序 -> 排序区域 -> 升序
设置排序 -> 订单业务 -> 未排序
设置排序 -> 订单 PolicyDt -> 未排序
结束阶段 INVOKE_APPLICATION 5
开始阶段 RENDER_RESPONSE 6
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 升序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/footer.xhtml @62,83 sortBy="#{item.regionName}"升序
获取排序 -> 订单业务 -> 未排序
获取排序 -> 排序区域 -> 升序
获取排序 -> 订单策略Dt -> 未排序
安排可用
/footer.xhtml @62,83 sortBy="#{item.regionName}"升序
步行 -> 开始
DB HIT
第一个 -> 0最后一个 -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
排序列表之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束

结束阶段 RENDER_RESPONSE 6

【问题讨论】:

  • 您是否在 getter 中从 DB 中获取数据?
  • @johny Nope... DB Hit 在extendedDataModel 的walk 方法中。
  • 对此的任何帮助都会非常有用!!!

标签: sorting jsf-2 richfaces richdatatable


【解决方案1】:

看看this issue

显然,walk 方法会出现这种行为。你应该写一个idempotent method,也就是说,你应该采取适当的行动来查询数据库一次。

但请注意,不仅在对结果进行分页时调用此方法,而且例如在调用将结果作为参数的方法时也会调用此方法。我为解决这个问题所做的是验证查询的参数是否发生了变化,如果是,我执行查询并遍历调用它们的 visitor.process 方法的结果,否则我只是遍历当前结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2011-09-18
    • 2015-11-29
    • 2013-09-14
    相关资源
    最近更新 更多