1

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

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

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

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

xhtml 片段

                <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 来获取数据###

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE RENDER_RESPONSE 6
Get Sort -> Order business -> unsorted
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Not Available
Total Count DB HIT
Data Creation
Get Sort -> Order business -> unsorted
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Not Available
Walk -> Start
DB HIT
First -> 0Last -> 3
Before Sort -> [com.entity. BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8] SortList
之前
排序后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
END PHASE RENDER_RESPONSE 6


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

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
Get Sort -> Order business -> unsorted
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Not Available
Walk -> Start
DB HIT
First - > 0Last -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8] SortList
前 排序
后 -> [com.entity.BusItem@514cef, com .entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
排序业务 -> 切换 -> 降序到升序
集排序 -> 订单业务 -> 升序
集排序 -> 订单 PolicyDt ->未分类
Set Sort -> Order region -> unsorted
END PHASE APPLY_REQUEST_VALUES 2
START PHASE RENDER_RESPONSE 6
Get Sort -> Order business ->升序
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Available
/test.xhtml @53,74 sortBy="#{item.busName}"ascending
获取排序 -> 订单业务 -> 升序
获取排序 -> 订单区域 -> 未排序
获取排序 -> 订单 PolicyDt -> 未排序
可用
/test.xhtml @53 ,74 sortBy="#{item.busName}"ascending
Walk -> Start
DB HIT
First -> 0Last -> 3
Before Sort -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac,com.entity.BusItem@1bcdc8]
在SortList 之前 排序
之后 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
步行 -> 结束
END PHASE RENDER_RESPONSE 6

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

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
获取排序 -> 订单业务 -> 升序
获取排序 -> 订单区域 -> 未排序
获取排序 -> 订单 PolicyDt -> 未排序
可用
/test.xhtml @53,74 sortBy ="#{item.busName}"ascending
Walk -> Start
DB HIT
First -> 0Last -> 3
Before Sort -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@ 514cef]排序
前SortList
后排序 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef]
Walk -> End
Sort Business -> Toggle -> Ascending to Descending
Set Sort - >订单业务 -> 降序
Set Sort -> Order PolicyDt -> unsorted
Set Sort -> Order region -> unsorted
END PHASE APPLY_REQUEST_VALUES 2
START PHASE RENDER_RESPONSE 6
Get Sort -> Order business -> descending
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Available
/test.xhtml @53,74 sortBy="#{item.busName}"descending
Get Sort -> Order business -> descending
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Available
/test.xhtml @53,74 sortBy="#{item.busName}"descending
Walk -> Start
DB HIT
First -> 0Last -> 3
排序前 -> [com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8, com.entity.BusItem@514cef] SortList
前 排序
后 -> [com.entity.BusItem@514cef, com.entity.BusItem@ 1921eac,com.entity.BusItem@1bcdc8]
步行 -> 结束
END PHASE RENDER_RESPONSE 6

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

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
Get Sort -> Order business -> unsorted
Get Sort -> Order region -> unsorted
Get Sort -> Order PolicyDt -> unsorted
Arrange Not Available
Walk -> Start
DB HIT
First - > 0Last -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8] SortList
前 排序
后 -> [com.entity.BusItem@514cef, com .entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
Walk -> End
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
Walk -> Start
DB HIT
First -> 0Last -> 3
排序前 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8] SortList
前 排序
后 -> [com.entity.BusItem@514cef, com.entity.BusItem@ 1921eac,com.entity.BusItem@1bcdc8]
步行 -> 结束
END PHASE_VALIDATIONS 3
开始阶段 UPDATE_MODEL_VALUES 4
步行 -> 首先开始
DB HIT
-> 0Last -> 3
排序前 -> [com.entity.BusItem@514cef,com. entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]排序
前SortList 排序
后 -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束
END PHASE UPDATE_MODEL_VALUES 4
开始阶段 INVOKE_APPLICATION 5
Sort Region-> Toggle -> Descending to Ascending
Set Sort -> Order region -> ascending
Set Sort -> Order business -> unsorted
Set Sort -> Order PolicyDt -> unsorted
END PHASE INVOKE_APPLICATION 5
START PHASE RENDER_RESPONSE 6
Get Sort -> Order业务 -> 未排序
获取排序 -> 订单区域 -> 升序
获取排序 -> 订单 PolicyDt -> 未排序
可用
/footer.xhtml @62,83 sortBy="#{item.regionName}"ascending
获取排序 -> 订单业务 - > unsorted
获取排序 -> 排序区域 -> 升序
获取排序 -> Order PolicyDt -> unsorted
Arrange Available
/footer.xhtml @62,83 sortBy="#{item.regionName}"升序
步行 -> 开始
DB HIT
First -> 0Last -> 3
Before Sort -> [com.entity.BusItem@514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
在SortList 之前 排序
之后 -> [com.entity.BusItem @514cef, com.entity.BusItem@1921eac, com.entity.BusItem@1bcdc8]
步行 -> 结束

结束阶段 RENDER_RESPONSE 6

4

1 回答 1

1

看看这个问题

显然,这种行为是该walk方法所期望的。您应该编写一个幂等方法,即您应该采取适当的措施来只查询一次数据库。

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

于 2014-08-15T19:58:24.093 回答