启动liquibase命令“ dropAllForeignKey”时内存不足

时间:2020-03-18 16:37:11

标签: java out-of-memory sybase liquibase

我正在具有12000多个表和380000多个列的Sybase数据库上运行liquibase命令“ dropAllForeignKey”。我遇到了内存不足的异常,因为liquibase代码正在尝试查询数据库中的所有列。

使用以下命令启动JVM:-Xms64M -Xmx512M(如果将其增加到5GO,它将起作用,但是我不明白为什么我们必须查询数据库中的所有列)

我正在使用的脚本:

<dropAllForeignKeyConstraints baseTableName="Table_Name"/>

当我检查liquibase代码时,我发现:

  1. 在DropAllForeignKeyConstraintsChange中:我们为xml中提到的表创建快照

    表目标= SnapshotGeneratorFactory.getInstance()。createSnapshot( 新表(catalogAndSchema.getCatalogName(),catalogAndSchema.getSchemaName(), database.correctObjectName(getBaseTableName(),Table.class)) ,数据库);

  2. 在JdbcDatabaseSnapshot中:当我们调用getColumns时,我们将调用bulkFetchQuery()而不是fastFetchQuery(),因为该表既不是“ DatabaseChangeLogTableName”也不是“ DatabaseChangeLogLockTableName”。在这种情况下,bulkFetchQuery不会对dropAllForeignKey xml中给定的表进行过滤。相反,它使用SQL_FILTER_MATCH_ALL,因此它将检索数据库中的所有列。 (查询所有列已花费时间)

  3. 在ColumnMapRowMapper中:对于每个表,我们创建一个LinkedHashMap,其大小等于列数。在这里,我的内存不足了

当删除给定表的所有外键时,我们查询所有列是否正常?如果是这样,为什么我们需要这样做,并且在不增加JVM大小的情况下可以解决我的问题?

PS:还有一个名为dropForeignKey的命令可以删除外键,但是它需要外键的名称作为输入,但我没有。实际上,我可以找到给定数据库的外键名称,但是我正在不同的数据库上运行此命令,并且外键的名称从一个更改为另一个,并且我需要对通用liquibase进行更改。因此,我不能使用dropForeignKey,而需要使用dropAllForeignKey。

在这里堆栈:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.LinkedHashMap.newNode(LinkedHashMap.java:256)
at java.base/java.util.HashMap.putVal(HashMap.java:637)
at java.base/java.util.HashMap.put(HashMap.java:607)
at liquibase.executor.jvm.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:35)
at liquibase.executor.jvm.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:72)
at liquibase.snapshot.ResultSetCache$ResultSetExtractor.extract(ResultSetCache.java:297)
at liquibase.snapshot.JdbcDatabaseSnapshot$CachingDatabaseMetaData$3.extract(JdbcDatabaseSnapshot.java:774)
at liquibase.snapshot.ResultSetCache$ResultSetExtractor.extract(ResultSetCache.java:288)
at liquibase.snapshot.JdbcDatabaseSnapshot$CachingDatabaseMetaData$3.bulkFetchQuery(JdbcDatabaseSnapshot.java:606)
at liquibase.snapshot.ResultSetCache$SingleResultSetExtractor.bulkFetch(ResultSetCache.java:353)
at liquibase.snapshot.ResultSetCache.get(ResultSetCache.java:59)
at liquibase.snapshot.JdbcDatabaseSnapshot$CachingDatabaseMetaData.getColumns(JdbcDatabaseSnapshot.java:539)
at liquibase.snapshot.jvm.ColumnSnapshotGenerator.addTo(ColumnSnapshotGenerator.java:106)
at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:79)
at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:49)
at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:286)
at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:102)
at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:59)
at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:38)
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:217)
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:246)
at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:230)
at liquibase.change.core.DropAllForeignKeyConstraintsChange.generateChildren(DropAllForeignKeyConstraintsChange.java:90)
at liquibase.change.core.DropAllForeignKeyConstraintsChange.generateStatements(DropAllForeignKeyConstraintsChange.java:59)

0 个答案:

没有答案