我有一些执行长动作的游戏工作(例如10秒)。
他们所做的一些事情需要一个db事务处理,而另一些则不需要。
由于整个作业是一个单一的交易,我将长期打开数据库交易,这不是一个好习惯。
将作业分成多个交易的最佳方法是什么? 我应该使用JPAPlugin closeTx然后使用startTx吗?
答案 0 :(得分:5)
我不认为长时间运行的数据库查询是如此糟糕。然而,糟糕的是,http线程将在此期间阻塞其他线程。
因此,我建议查看Futures,并使用suspend方法,以便http请求可以免费提供,并且您可以检查您的未来任务是否定期完成而不阻止其他传入的http请求。
此外,在Play 1.2(即将推出测试版)中,它可以更好地支持FutureTasks并将响应延迟回浏览器。
答案 1 :(得分:1)
按作业我假设你的意思是Job,而不是HTTP请求。
如果您正在使用请求触发某个长任务,请尝试将任务分解为同步和异步部分,以便快速返回用户(并关闭请求事务),然后再返回异步部分(通过工作或未来)将解决其余问题。如果异步任务失败,可能需要一些补偿代码,但没关系。
如果需要很长时间的是异步作业并且您正在使用许多实体,请尝试将其分解为较小的作业。执行类似于存储在表中的任务队列以及每隔几秒运行一次并且仅执行第一项任务的作业。这样你就不会遇到与长期交易有关的问题。
如果你不能完成任务(不太可能,但可能会发生)那么就没有必要担心它了:)