2016-02-12 80 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

只有在可以直接訪問數據存儲的情況下,否則可以找到查看數據庫中的數據是否已更改的最佳方法。 –