Oracle兼容模式中的H2被验证为H2,而不是oracle

时间:2014-01-28 23:56:03

标签: oracle gradle h2 liquibase

在生产中我使用的是Oracle,所有的更改日志都是用Oracle编写的。 在我的开发环境中,我正在尝试在Oracle兼容模式下在H2实例上生成更改日志。 这是为了提高集成测试速度。

我的问题是Liquibase正在验证我对H2的更改日志,而不是Oracle。 有没有办法迫使Liquibase对Oracle进行验证,即使我的db url看起来像是H2?

我最头疼的是关于序列和dropNotNullConstraint验证。

Liquibase版本: 2.0.5(我也试过3.1.1,同样的问题)

H2连接url: jdbc:h2:tcp:// localhost:9092 / test; MODE = Oracle; AUTO_SERVER = TRUE; DB_CLOSE_DELAY = -1

我很确定这是一种常见情况,所以我猜我可能做错了什么?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

由于Liquibase是用Java实现的并且依赖于JDBC,我将使用Java来解释。 Liquibase有一个已实现的数据库列表。这取决于你如何从Java代码中调用它,但是假设您使用liquibase.database.DatabaseFactory,扩展它或实现类似的东西。通常你的代码看起来像这样(Scala中的例子):

  def createLiquibase(dbConnection: Connection, diffFilePath: String): Liquibase = {
    val database = DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection))
    val classLoader = classOf[SchemaMigration].getClassLoader
    val resourceAccessor = new ClassLoaderResourceAccessor(classLoader)
    new Liquibase(diffFilePath, resourceAccessor, database)
  }

  def updateDb(db: DbConnectionProvider, diffFilePath: String): Unit = {
    val dbConnection = db.getConnection
    val liquibase = createLiquibase(dbConnection, diffFilePath)
    try {
      liquibase.update(null)
    } catch {
      case e: Throwable => throw e
    } finally {
      liquibase.forceReleaseLocks()
      dbConnection.rollback()
      dbConnection.close()
    }
  }

请注意此部分DatabaseFactory.getInstance.findCorrectDatabaseImplementation(new JdbcConnection(dbConnection))我们传入java.sql.Connection,Liquibase会为其找到适当的Database实现。您可以覆盖findCorrectDatabaseImplementation,甚至可以创建自己的Database子类。无论你喜欢什么。

DatabaseFactory中的方法是public Database findCorrectDatabaseImplementation(DatabaseConnection connection) throws DatabaseException。从那里,您可以了解有关Database类型的更多信息。您可以从H2或Oracle继承它并覆盖某些部分。

如果您使用Liquibase cmd客户端,您可以执行我上面描述的操作,构建一个jar文件等,然后从命令行运行,确保您的新类在类路径上。

H2中的兼容模式并不能保证完全支持Oracle,Postgres等,因此在它上面测试Oracle DML有点可疑。它可能会工作,直到你找不到它为止。