Недостаточно памяти при запуске команды liquibase "dropAllForeignKey" - PullRequest
0 голосов
/ 18 марта 2020

Я запускаю команду liquibase "dropAllForeignKey" в базе данных Sybase с более чем 12000 таблиц и более чем 380000 столбцами. Я получаю исключение из-за нехватки памяти, так как код liquibase пытается запросить все столбцы в базе данных.

JVM запускается с: -Xms64M -Xmx512M (если я увеличу его до 5 GO это будет работать, но я не понимаю, почему мы должны запрашивать все столбцы в базе данных)

Сценарий, который я использую:

<dropAllForeignKeyConstraints baseTableName="Table_Name"/>

Когда я проверял код ликвидазы Я обнаружил, что:

  1. В DropAllForeignKeyConstraintsChange: мы создаем снимок для таблицы, упомянутой в xml

    Таблица target = SnapshotGeneratorFactory.getInstance (). CreateSnapshot (new Table (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 с размером aqual для количества столбцов. И вот, я получаю нехватку памяти

Это нормально, что мы запрашиваем весь столбец при отбрасывании всех внешних ключей для данной таблицы? Если это так, то зачем нам это делать, и есть ли решение моей проблемы без увеличения размера JVM?

PS: есть еще одна команда dropForeignKey для удаления ключа forign, но ей нужен имя внешнего ключа в качестве ввода, и у меня его нет. На самом деле, я могу найти имя внешнего ключа для данной базы данных, но я запускаю эту команду для разных баз данных, и имя внешнего ключа меняется с одного на другое, и мне нужно иметь обобщенный c изменение ликвидазы. Итак, я не могу использовать 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)
...