【问题标题】:Playframework jpa pagination skips every second pagePlayframework jpa分页每隔一页跳过一次
【发布时间】:2012-04-18 04:53:37
【问题描述】:

我正在使用 jpa 和 mysql 运行 playframework 1.2.4。

我有一个从数据库中检索前 20 个活动的作业,将状态设置为活动以停止执行它们的其他作业实例,执行活动然后获取活动的下一页并重复直到所有活动完成。但是它似乎每隔一页跳过一次,或者我的页面大小为 20 的 20 条记录。我的逻辑如下。

long total = Activity.count(q, params);
int page = 1;
int pageSize = 20;

int pages = ...

while (page <= pages) {

JPAPlugin.startTx(false);
Collection<Activity> activities = Activity.find(query, params).fetch(page, pageSize);

for (Activity activity : activities) {
    activity.status = ActivityStatus.ACTIVE;
    activity.save();
}
JPAPlugin.closeTx(false);

JPAPlugin.startTx(false);
for (Activity activity : activities) 
    longProcessActivityInAnotherTransaction(activity);
JPAPlugin.closeTx(false);

page++;
}

但是在数据库中,我看到状态为 ACTIVE 的记录 1-20、没有状态 ACTIVE 的 21-40、状态为 ACTIVE 的 61-80 等等。

这似乎与交易有关。如果我在 while 循环中注释掉所有事务启动/关闭代码,并打印出所选活动的 id,我可以看到所有活动都已正确选择。

如果我在调试模式下运行并暂停执行中间循环,并直接针对 mysql 数据库运行生成的查询,我会看到与代码中相同的行为。当循环未执行时,sql 查询按预期执行。

我的连接字符串是:

mysql://root:pass@localhost/dbname

有什么建议吗?

【问题讨论】:

    标签: java mysql jpa playframework


    【解决方案1】:

    我的问题归结为我在分页查询期间如何更改活动。我选择了状态为 PENDING 的前 20 个页面。然后在那个页面中,我会将这 20 个的状态设置为 FINISHED。然后我会得到 20 PENDING 的第二页。这个后续的查询显然会忽略我设置为 FINISHED (id 1-20) 的前 20 个,并将 id 为 21-40 的活动视为第 1 页,因此会选择第 2 页,即 id 为 41-60 的活动。

    因此,解决方法是不使用分页,而是每次将结果限制为前 20 个(页面大小)并在页面 时循环此查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2019-02-08
      • 2016-10-02
      相关资源
      最近更新 更多