【问题标题】:liquibase.exception.DatabaseException in LiquibaseLiquibase 中的 liquibase.exception.DatabaseException
【发布时间】:2014-12-31 09:29:12
【问题描述】:

在 Liquibase 中,每当我为大型数据库使用 generateChangeLog 时,它都会给我错误,而对于小型数据库,它运行良好。

我的错误控制台如下:

cmd命令:

   E:\liquibase-3.3.1-bin>liquibase 
   --driver=com.mysql.jdbc.Driver 
   --classpath=mysql-connector-java-5.1.6-bin.jar 
   --changeLogFile=xml\test11.xml 
   --url="jdbc:mysql://localhost:4928/test" 
   --username=root 
   --password=root 
   --diffTypes="tables,columns, foreignkeys,primarykeys, uniqueconstraints,
    data" generateChangeLog

错误: 运行 Liquibase 时出现意外错误:liquibase.exception.DatabaseException:java.lang.StringIndexOutO fBoundsException:字符串索引超出范围:-1

完整跟踪:

liquibase: liquibase.exception.DatabaseException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
liquibase.exception.LiquibaseException: liquibase.command.CommandExecutionException: liquibase.exception.DatabaseException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at liquibase.integration.commandline.CommandLineUtils.doGenerateChangeLog(CommandLineUtils.java:155)
        at liquibase.integration.commandline.Main.doMigration(Main.java:939)
        at liquibase.integration.commandline.Main.run(Main.java:177)
        at liquibase.integration.commandline.Main.main(Main.java:96)
Caused by: liquibase.command.CommandExecutionException: liquibase.exception.DatabaseException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at liquibase.command.AbstractCommand.execute(AbstractCommand.java:13)
        at liquibase.integration.commandline.CommandLineUtils.doGenerateChangeLog(CommandLineUtils.java:153)
        ... 3 more
Caused by: liquibase.exception.DatabaseException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.snapshotObject(ColumnS
napshotGenerator.java:69)
        at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGen
erator.java:60)
        at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorC
hain.java:50)
        at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:163
)
        at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.ja
va:241)
        at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnap
shot.java:195)
        at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:177
)
        at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.ja
va:241)
        at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.ja
va:263)
        at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnap
shot.java:195)
        at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:177
)
        at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:60)
        at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:37)
        at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.j
ava:25)
        at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGe
neratorFactory.java:126)
        at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGe
neratorFactory.java:119)
        at liquibase.command.DiffCommand.createReferenceSnapshot(DiffCommand.jav
a:190)
        at liquibase.command.DiffCommand.createDiffResult(DiffCommand.java:140)
        at liquibase.command.GenerateChangeLogCommand.run(GenerateChangeLogComma
nd.java:45)
        at liquibase.command.AbstractCommand.execute(AbstractCommand.java:8)
        ... 4 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range:
 -1
        at java.lang.String.substring(Unknown Source)
        at liquibase.util.SqlUtil.parseValue(SqlUtil.java:101)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readDefaultValue(Colum
nSnapshotGenerator.java:345)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readColumn(ColumnSnaps
hotGenerator.java:200)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.snapshotObject(ColumnS
napshotGenerator.java:45)
        ... 23 more

【问题讨论】:

  • 你有更详细的stacktrace吗?
  • 我没有更详细的堆栈跟踪,但我注意到每当我为许多表(大约 900-1200)进行 generateChangeLog 进程时,如果任何表在其中有很多条目(超过 50000 行)那个时候我得到了这个例外。在我的数据库中有 3000 个表,许多表有很多数据。如果我忽略那些大表,那么它的工作原理就是一件事
  • 如果你使用 --logLevel=DEFAULT 运行它应该会给你一个更好的堆栈跟踪
  • 查看我的编辑以了解详细的堆栈跟踪。
  • 我们在很多表中都有枚举数据类型的列

标签: indexoutofboundsexception liquibase


【解决方案1】:

根据the comment of Sergei Visotsky,当存在数据库视图时,似乎会出现此异常。

在我的情况下,放弃意见解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2021-09-25
    • 2019-07-23
    相关资源
    最近更新 更多