我正在思考如何开发短信网关平衡的管理。简而言之,我有很多客户,每个客户都有余额。 每次发送短信时,应减少余额。我也可以通过存款为账户充值。
我的问题是对这种情况进行建模的最佳方法。第一个想法是使用@Formula获取余额而不将其存储在数据库中。但是,有了数千甚至数百万行,这种方法每次都会变慢。所以我认为它不具备可扩展性并且效率不高。
使用列替换余额,由于并发问题,我可能会降低整个系统的速度。每次我想发送短信时我都要使用PESSIMISTIC LOCK。所以我减少了并发性(客户希望在几秒钟内发送数百个短信)
所以我问是否有一种聪明的方法来管理它。我确信有一种聪明的方法,否则我无法解释有多少非常大的提供商可以在一天内管理数百万短信。
总结一下我的实体客户类似于:
@Entity
public class Customer implements Serializable{
private String name;
//Solution with persisted column
private BigDecimal balance;
//solution using formula instead of a real column in the db
@Formula("CAST((SELECT COALESCE(SUM(r.importo),0) FROM RicaricaTelefonica r WHERE r.cliente_id=id)-(SELECT COALESCE(SUM(t.importoVendita),0) from Telefonata t WHERE t.cliente=id) AS DECIMAL(10,2))")
private BigDecimal balance= BigDecimal.ZERO;
}
对@Formula的查询只是一个例子,没有看到它,但考虑一下这个想法。
========更新=========== 我有另一个想法可能更聪明。使用混合解决方案。创建一个新对象Balance在特定时间内存储余额,并使用@Formula根据db +上保存的最后一个Balance计算余额。
通过这种方式,我可以每天保存数据库中的余额,或者使用悲观写入每4小时保存一次,以便提供余额的正确性。 用户的实时平衡将是一个类似
的公式@Formula("SELECT * FROM Balance ORDER BY date DESC LIMIT 1"-"SELECT SUM(price) FROM Sms WHERE date>=balanceDate"+"SELECT * from Deposit WHERE date>=balanceDate")
您怎么看?