2012-04-04 64 views
0

我正在使用jpa和mysql運行playframework 1.2.4。Playframework jpa分頁跳過每隔一頁

我有一個工作,從數據庫檢索前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++; 
} 

但是在數據庫中,我看到的記錄與1-20 ACTIVE狀態,21-40無有效狀態,61-80有品位的活動等。

它似乎與交易有關。如果我在while循環中註釋掉所有的交易開始/結束代碼,並打印出所選活動的id,我可以看到所有活動都被正確選中。

如果我在調試模式下運行並暫停執行中間循環,並直接對mysql數據庫運行生成的查詢,我會看到與代碼中相同的行爲。當循環沒有執行時,sql查詢按預期執行。

我的連接字符串是:

的mysql://根:通過@本地/ DBNAME

有什麼建議?

回答

0

我的問題歸結爲我在分頁查詢期間如何更改活動。我選擇了前20個狀態爲PENDING的頁面。那麼在那個頁面中,我會將那20個的狀態設置爲FINISHED。那麼我會得到20個待辦事項的第二頁。這個隨後的查詢obvioulsy會忽略我設置爲完成的前20個(id 1-20)並將id爲21-40的活動視爲第1頁,因此會選擇第2頁,這是活動ID爲41-60的活動。

因此,解決方法是不使用分頁,但每次僅將結果限制爲前20(頁面大小),並循環查詢,而頁面< =第

號頁面