2017-04-06 170 views
2

我正在學習Flyway遷移工具,並且我沒有清除校驗和的概念。有人能解釋我是什麼嗎?它如何計算,或者如何改變?flyway - 校驗和概念的含義

我明白修復命令重新計算校驗和,我不明白它有什麼不同。

謝謝!

回答

4

Flyway中的Checksum字段構成驗證機制的一部分,確保遷移腳本自應用到數據庫後未發生更改。這將保證您的應用程序的所有實例都具有相同的數據庫結構(內容)。您可以關閉驗證,但我不會建議您這樣做。回答您的問題:

什麼是?

只是谷歌什麼是校驗和。 Wikipedia

它是如何計算的?

對於SQL遷移,Flyway使用CRC32類來計算校驗和。準確的代碼見下文。

如何更改?

一旦您遷移的二進制內容被修改,遷移的校驗和將被更改。如果要在計算新版遷移文件的校驗和時更改數據庫中的校驗和字段,然後更改數據庫中的值。不過,我不建議這樣做。你不應該這樣做,而你想改變它的事實可能表明你做錯了什麼。總之,對於校驗和計算代碼非常簡單(與遷飛源代碼提供):

/** 
    * Calculates the checksum of this string. 
    * 
    * @param str The string to calculate the checksum for. 
    * @return The crc-32 checksum of the bytes. 
    */ 
    /* private -> for testing */ 
    static int calculateChecksum(Resource resource, String str) { 
     final CRC32 crc32 = new CRC32(); 

     BufferedReader bufferedReader = new BufferedReader(new StringReader(str)); 
     try { 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       crc32.update(line.getBytes("UTF-8")); 
      } 
     } catch (IOException e) { 
      String message = "Unable to calculate checksum"; 
      if (resource != null) { 
       message += " for " + resource.getLocation() + " (" + resource.getLocationOnDisk() + ")"; 
      } 
      throw new FlywayException(message, e); 
     } 

     return (int) crc32.getValue(); 
    } 
+0

非常感謝您@Mikhail Chibel!很有用! – AleGallagher