Я запускаю команду liquibase "dropAllForeignKey" в базе данных Sybase с более чем 12000 таблиц и более чем 380000 столбцами. Я получаю исключение из-за нехватки памяти, так как код liquibase пытается запросить все столбцы в базе данных.
JVM запускается с: -Xms64M -Xmx512M (если я увеличу его до 5 GO это будет работать, но я не понимаю, почему мы должны запрашивать все столбцы в базе данных)
Сценарий, который я использую:
<dropAllForeignKeyConstraints baseTableName="Table_Name"/>
Когда я проверял код ликвидазы Я обнаружил, что:
В DropAllForeignKeyConstraintsChange: мы создаем снимок для таблицы, упомянутой в xml
Таблица target = SnapshotGeneratorFactory.getInstance (). CreateSnapshot (new Table (catalogAndSchema.getCatalogName (), catalogAndSchema.getSchemaName (), database.correctObjectName (getBaseTableName (), Table.class)), база данных);
В JdbcDatabaseSnapshot: когда мы вызываем getColumns мы вызываем bulkFetchQuery () вместо fastFetchQuery (), поскольку таблица не является ни DatabaseChangeLogTableName, ни DatabaseChangeLogLockTableName. В этом случае bulkFetchQuery не фильтрует таблицу, указанную в dropAllForeignKey xml. Вместо этого он использует SQL_FILTER_MATCH_ALL, поэтому он будет извлекать все столбцы в базе данных. (Уже требуется время для запроса всех столбцов)
В 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)