MySQL检查表是否有一些记录被更改

时间:2016-02-12 12:35:02

标签: java mysql sql database

我正在开发一个使用MySQL数据库作为数据存储层的Java应用程序。数据库中的配置表很少,但每个表都有数千个记录/行。当应用程序启动时,这些所有配置都在相应的数据结构/ bean(JAVA POJO)中缓存/加载到内存中。

一切都很好,除了每次应用程序启动时都会发生缓存,这通常需要15-20分钟,因为要缓存的数据很大,而且有些列的XML字符串会被解析然后存储在bean中。

那有什么大不了的?

  • 为什么我们应该在连续启动之间没有数据更改时进行缓存。我可以将所有bean封装在一个公共的Config bean中并对其进行序列化。并且当我发现没有数据被更改时,下次加载此序列化对象 - 当然加载序列化对象比数据库命中加上bean数量快得多。

那么有什么方法可以解决这个问题吗? 当然是在数据库级别。我会在应用程序启动时查询 - 自上次启动以来数据库表是否有任何更改。如果是,则执行相同的旧无聊缓存过程并存储一些唯一标识符和序列化,或者如果最后一个标识符和当前标识符相同,则只加载序列化对象。这个唯一标识符当然是持久的。

2 个答案:

答案 0 :(得分:1)

在表格中添加sample(x,y)last_updated列。

当您需要检查表上是否有更改时,只需执行查询:

timestamp

如果last_updated在您创建最后一个缓存副本之后,您可以使用与上一次创建缓存相关的元素更新缓存,并使用与此类似的查询更新缓存:

select max(last_updated) from YOUR_TABLE

正如评论中所解释的那样,可以在列select * from YOUR_TABLE where last_updated > LAST_CACHE_UPDATE 上添加索引。使用索引,您可以在30个步骤中检索1.000.000.000记录表中的最大值(而不是评论中提到的1.000.000.000错误)。

答案 1 :(得分:0)

如果你重新启动你的应用程序并且你的缓存可以存在于内存数据结构中,比如redis或hazelcast,那么将它用作缓存,而不是jvm内存。更新数据时,更新双方。