校验和是否是查看MySQL中是否已修改表的好方法?

时间:2016-02-05 21:08:04

标签: java mysql

我目前正在开发一个使用JDBC连接到MySQL数据库的Java应用程序,并在jTable中显示记录。该应用程序将由多个用户一次运​​行,我试图实现一种方法来查看该表是否已被修改。 EG如果用户1修改了诸如库存水平之类的列,然后用户2尝试访问同一记录,则尝试在用户进行交互之前根据级别对其进行更改。

目前我正在存储显示为变量的表的校验和,当用户尝试修改记录时,它将检查存储的校验和是否与在编辑之前生成一个。

由于我是新手,我不确定这是否是正确的做法;因为我没有这方面的经验。

3 个答案:

答案 0 :(得分:1)

计算整个表的校验和似乎是一个非常严厉的解决方案,绝对不会长期扩展。有多种方法可以解决这个问题,但核心主题是尽可能少地工作,以确保您可以随着用户数量的增加而扩展。想象一下,在桌面上实现基于校验和的解决方案,数百万用户不断更新百万行!

其中一个解决方案(需要最少的重复工作)将是"检查"更新值的库存名称。在后台,您将在查询表中查看是否有"该特定股票的数据"在填充表格之后已更新。如果是,您可以警告用户或将更新的单元格标记为脏,以指示该值已更改。这里的问题是,在用户尝试保存更新的值之前,查询不会被触发。或者您可以轮询数据库以避免这种情况,但又不是一个有效的解决方案。

作为一个更强大的解决方案,我建议使用一个实现原生"推送通知的数据库"到所有连接的客户端。 Redis是一个NoSQL数据库,我想到这一点。

另一种久经考验的技术是放弃直接数据库连接并使用中间件层,如消息队列(例如RabbitMQ)。消息队列可以设计使用消息进行通信的系统。因此对于例如每次更新JTable中的库存值都将作为消息发送到更新数据库队列"。更新完成后,将一条消息发送到更新通知队列"所有客户都将连接到哪个。这将使他们所有人都知道给定股票的价值已经更新并采取相应的行动。此解决方案的优势在于您可以保留现有堆栈(Java,MySQL)并且可以实现通知,而无需轮询数据库并将其终止。

答案 1 :(得分:0)

Checksum是一种查看数据是否已更改的方法。 无论如何,我建议你存储一个列" last_update_date",该列应该在每次更新记录时始终更新。 因此,您必须存储此日期(精确日期时间)并进行检查。 您还可以添加列版本号:每次更新时,简单计数器加1。

注意: 您可以在更新时添加触发器以更新last_update_date,它应该是100%可靠的,如果您控制所有更新,也许您不需要触发器。

答案 2 :(得分:0)

在网络通讯中使用时:

  

校验和是传输单元中位数的计数   包含在单元中,以便接收器可以检查   是否到达相同的位数。如果计数匹配,那就是   假设已收到完整的传输。

所以它可以被翻译为检查2个对象是不同的,你的方法是正确的。