【问题标题】:flyway hsql db create tables sql migrate hangsflyway hsql db 创建表 sql migrate 挂起
【发布时间】:2016-11-11 18:36:49
【问题描述】:

我正在使用 maven 执行 flyway。 我有一个 sql(它有 DDL 创建表 - DEPARTMENT , EMPLOYEE 如下所示) 我跑mvn compile flyway:migrate

这是控制台日志。

......
[INFO] Successfully validated 3 migrations (execution time 00:00.097s)
[DEBUG] Schema "PUBLIC" already exists. Skipping schema creation.
[DEBUG] Locking table "PUBLIC"."schema_version"...
[DEBUG] Lock acquired for table "PUBLIC"."schema_version"
[INFO] Current version of schema "PUBLIC": 1
[INFO] Migrating schema "PUBLIC" to version 1.1 - department
[DEBUG] Found statement at line 2: CREATE TABLE Department (
ID INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 1) PRIMARY KEY,
NAME VARCHAR(32) NOT NULL ,
DESCRIPTION VARCHAR(100)
)
[DEBUG] Found statement at line 8: CREATE TABLE EMPLOYEE (
ID INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 1) PRIMARY KEY ,
NAME VARCHAR(100) NOT NULL ,
DEPARTMENTID INTEGER FOREIGN KEY REFERENCES PUBLIC.DEPARTMENT(ID)
)
[DEBUG] Executing SQL: CREATE TABLE Department (
ID INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 1) PRIMARY KEY,
NAME VARCHAR(32) NOT NULL ,
DESCRIPTION VARCHAR(100)
)

第一次创建表即部门表后执行挂起。 然后我使用 ctrl+C 杀死我看到 schema_version 和 Department 表单独被创建。

我尝试了其他创建表的方法,即没有 ID 生成,添加 ';'最后,在每个 CREATE TABLE 之后添加 GO,但它没有帮助。

同样的创建表 sql 使用 Squirrel SQL 客户端成功运行。 我正在使用 flyway 版本 4.0.3 和 hsqldb 2.3.4。 在调试时可以看到,此时它正在等待来自 DB 的响应 I/O 完成 => boolean hasResults = statement.execute(sql);在 org.flywaydb.core.internal.dbsupport.JdbcTemplate 类中

更新:

正如 Fredt 所说,使用 hsqldb-2.3.3 时不会出现此问题

【问题讨论】:

    标签: sql hsqldb flyway


    【解决方案1】:

    此问题特定于具有更严格锁定的 HSQLDB 2.3.4。您可以将事务模型设置为 MVCC 以避免该问题。或者使用 HSQLDB 2.3.3 版。

    【讨论】:

    • 如何设置。我曾尝试以这种方式在 flyway 属性中指定 jdbc url: jdbc:hsqldb:file:db1;hsqldb.tx=mvcc OR jdbc:hsqldb:hsql://localhost/db1;hsqldb.tx=mvcc ,但我看不到区别。我在 squirrel 客户端中使用上述相同的 url 登录并在登录元数据后 - 客户端属性我仍然将 hsqldb.tx 视为 LOCKS 而不是 MVCC。
    • 是的,我在 2.3.3 中没有看到这个问题。暂时我可以使用它,但是我需要让它与 2.3.4 一起使用。在我的情况下,fly way 似乎运行 sql,所以我试图找出如何在服务器或数据库级别执行它。同样在 2.3.3 中,当我签入 squirrel 客户端元信息时 - 客户端属性我仍然看到 hsqldb.tx 是 LOCKS 并且这里没有问题
    • 请参阅服务器上的 HSQLDB 指南。您需要将hsqldb.tx=mvcc 或任何其他属性附加到服务器属性中的数据库文件路径。
    • 据我所知,设置 hsqldb.tx=mvcc 没有帮助。此外,当 2.3.3(在其默认配置中工作)配置为使用 MVCC 时,它也会挂起。我在 GitHub 上分享了一个重现问题的示例和我的发现摘要:github.com/wilkinsona/flyway-hsqldb-hang
    • 我可以使用 MVCC 事务成功运行 HSQLDB,但在 Flyway 迁移期间将模型更改为 LOCKS(它仅适用于 LOCKS,但我的应用程序需要 MVCC)使用 Flyway 回调 beforeMigrateafterMigrate,请在 stackoverflow.com/a/39274854/2043553 上查看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2020-10-27
    • 2012-10-23
    • 2013-01-08
    • 2016-05-31
    • 2013-10-19
    相关资源
    最近更新 更多