【发布时间】:2015-12-27 10:40:46
【问题描述】:
我有一个表,其中有一列需要不断地重新计算,我希望这个表是可扩展的。用户也必须能够在上面写字。
如果没有服务器和并发用户,很难测试这种类型的东西,至少我不知道如何。 那么这两个选项之一是否可行?
@ApplicationScoped
public class Abean {
@EJB
private MyService myService;
@Asynchronous
public void computeTheData(){
long i = 1;
long numberOfRows = myService.getCountRows(); // gives the number of row in the table
while(i<numberOfRows){
myService.updateMyRow(i);
}
computeTheData(); // recursion so it never stops, I'm wondering if this wouldn't spawn more threads and if it would be an issue.
}
}
public class MyService implements MyServiceInterface{
...
public void updateMyRows(int row){
Query query = em.createQuery("SELECT m FROM MyEntity WHERE m.id=:id");
Query.setParameter("id", row);
List<MyEntity> myEntities = (MyEntity) query.getResultList();
myEntity.computeData();
}
}
VS
@ApplicationScoped
public class Abean {
@EJB
private MyService myService;
@Asynchronous
public void computeTheData(){
myService.updateAllRows();
}
}
public class MyService implements MyServiceInterface{
...
public void updateAllRows(int page){
Query query = em.createQuery("SELECT m FROM MyEntity");
List<MyEntity> myEntities = (MyEntity) query.getResultList();
myEntity.computeData();
}
}
这些可行吗?我用的是mysql,表的引擎是innoDB。
【问题讨论】:
-
我不确定如何理解这个问题。你想达到什么目的?您是否想测试性能并且您想编写一些测试代码,以更新数据库中的每一行,甚至多次(根据示例 1 中的无限递归)?
-
@OndrejM 我有一列是 hot_score,它是时间的函数(reddit 算法)。我希望能够告诉我的数据库选择最高热分的前 20 名。但是,由于它是时间的函数,我需要不断更新它。但如果我不断更新它,那么用户就无法在上面写字。所以我正在努力寻找解决方案。
-
好的,我知道您需要支持并发更新 - 来自频繁的后台作业和来自用户的更新。如果您使用乐观锁定,您可能会遇到问题。我建议在事务期间使用悲观锁定来锁定已修改的实体。如果您希望查看代码示例,我稍后会在完整的答案中进行解释。
-
@OndrejM 非常感谢。实际上我正在学习 Cassandra 将我的数据库迁移到它。你认为这会是一个好的解决方案吗?
标签: mysql jpa concurrency eclipselink jpql