在 Java 迁移中实施校验和
Implementing checksums in Java migrations
我的 Java 迁移目前没有实现 MigrationChecksumProvider 接口。我想知道他们是否应该这样做。
我不明白校验和在 Flyway 中起什么作用。请有人向我解释一下吗?此外,如果我实施 MigrationChecksumProvider,应该如何计算给定迁移的校验和?
谢谢。
校验和用于迁移的(意外)更改检测,这将使对架构可以准确重新创建的保证失效。
对于 Java 迁移,天空是您所能做的极限。因此,您可以决定如何实施校验和来检测更改。
我想大多数时候你想根据相关 class 文件的内容来计算校验和。我们是这样做的....
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import org.flywaydb.core.api.migration.jdbc.JdbcMigration;
import org.flywaydb.core.internal.util.FileCopyUtils;
import org.flywaydb.core.internal.util.logging.Log;
import org.flywaydb.core.internal.util.logging.LogFactory;
/**
* Utility class for checksum calculations.
*
*/
public final class Checksums {
private static final Log LOG = LogFactory.getLog(Checksums.class);
private Checksums() {
super(); // singleton
}
/**
* Calculates a checksum based on the given JdbcMigration. It builds the checksum from the byte content of the given
* migration class file using the same {@link CRC32} method as used by
* {@link org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver}
*
* @param migration
* @return the checksum
*/
public static final Integer checksum(JdbcMigration migration) {
Integer checksum = null;
Class<?> migrationClass = migration.getClass();
String migrationClassFilePath = migrationClass.getName().replace(".", System.getProperty("file.separator")) + ".class";
InputStream inputStream = null;
try {
inputStream = ClassLoader.getSystemResourceAsStream(migrationClassFilePath);
byte[] classContent = FileCopyUtils.copyToByteArray(inputStream);
final CRC32 crc32 = new CRC32();
crc32.update(classContent);
checksum = (int) crc32.getValue();
} catch (IOException ioe) {
LOG.error("Problem calculating checksum for class " + migrationClass.getName(), ioe);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ioe) {
LOG.error("Problem closing input stream to " + migrationClassFilePath, ioe);
}
}
}
return checksum;
}
}
然后你可以创建一个看起来像
的基础class
public abstract class JdbcMigrationWithChecksum implements JdbcMigration, MigrationChecksumProvider {
@Override
public Integer getChecksum() {
return Checksums.checksum(this);
}
}
我的 Java 迁移目前没有实现 MigrationChecksumProvider 接口。我想知道他们是否应该这样做。
我不明白校验和在 Flyway 中起什么作用。请有人向我解释一下吗?此外,如果我实施 MigrationChecksumProvider,应该如何计算给定迁移的校验和?
谢谢。
校验和用于迁移的(意外)更改检测,这将使对架构可以准确重新创建的保证失效。
对于 Java 迁移,天空是您所能做的极限。因此,您可以决定如何实施校验和来检测更改。
我想大多数时候你想根据相关 class 文件的内容来计算校验和。我们是这样做的....
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import org.flywaydb.core.api.migration.jdbc.JdbcMigration;
import org.flywaydb.core.internal.util.FileCopyUtils;
import org.flywaydb.core.internal.util.logging.Log;
import org.flywaydb.core.internal.util.logging.LogFactory;
/**
* Utility class for checksum calculations.
*
*/
public final class Checksums {
private static final Log LOG = LogFactory.getLog(Checksums.class);
private Checksums() {
super(); // singleton
}
/**
* Calculates a checksum based on the given JdbcMigration. It builds the checksum from the byte content of the given
* migration class file using the same {@link CRC32} method as used by
* {@link org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver}
*
* @param migration
* @return the checksum
*/
public static final Integer checksum(JdbcMigration migration) {
Integer checksum = null;
Class<?> migrationClass = migration.getClass();
String migrationClassFilePath = migrationClass.getName().replace(".", System.getProperty("file.separator")) + ".class";
InputStream inputStream = null;
try {
inputStream = ClassLoader.getSystemResourceAsStream(migrationClassFilePath);
byte[] classContent = FileCopyUtils.copyToByteArray(inputStream);
final CRC32 crc32 = new CRC32();
crc32.update(classContent);
checksum = (int) crc32.getValue();
} catch (IOException ioe) {
LOG.error("Problem calculating checksum for class " + migrationClass.getName(), ioe);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ioe) {
LOG.error("Problem closing input stream to " + migrationClassFilePath, ioe);
}
}
}
return checksum;
}
}
然后你可以创建一个看起来像
的基础classpublic abstract class JdbcMigrationWithChecksum implements JdbcMigration, MigrationChecksumProvider {
@Override
public Integer getChecksum() {
return Checksums.checksum(this);
}
}