2016-02-12 121 views
0

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

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

那么最重要的是什么?

  • 为什么我们应该在连续启动之间没有数据更改时缓存?我可以将所有的bean封装在一个通用的Config bean中并对其进行序列化。当我找出没有数据被改变时加载这个序列化的对象 - 当然,加载序列化对象的速度远快于数据库命中加豆的数量。

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

+0

怎么样MySQL CHECKSUM TABLE。我试着改变一行的列数据,并修改了校验和。 –

回答

1

timestamp类型的last_updated列添加到表中。

当你需要检查是否有对表的修改简单地执行查询:

select max(last_updated) from YOUR_TABLE 

如果LAST_UPDATED是后您创建的最后一个缓存时间复制可以更新只与元素缓存自去年创建缓存的改变与类似这样的查询:

select * from YOUR_TABLE where last_updated > LAST_CACHE_UPDATE 

正如评论解释是higly recomandable对CO添加一个索引lumn last_updated。使用索引可以在30个步骤中检索1.000.000.000记录表中的最大值(不是1.000.000.000,因为注释中提到的错误)。


+0

是这么简单吗?他仍然需要通过逐个比较日期来检查哪一行发生了变化 – halil

+0

是的,如果您在列last_updated上添加索引并且您使用索引 –

+0

这对于一个好问题来说并不是最佳答案。这是我的第一个简单的答案。如果他有100行和1行已更改,他必须检查1亿日期,以找出哪一行更改? – halil

0

如果重新启动应用了很多,你的缓存可以住在离像Redis的或hazelcast内存中的数据结构,用它作为缓存,而不是JVM内存。更新数据时,更新双方。

+0

只有在可以更新通过redis传递的记录时才有效。如果更新是通过sql客户端直接完成的,则不考虑 –

+0

这是高速缓存的目的,当需要更新记录时,更新数据存储区和高速缓存区! –

+0

只有在可以直接访问数据存储的情况下,否则可以找到查看数据库中的数据是否已更改的最佳方法。 –