OutofmemoryError: пытаясь оптимизировать мультимодульные модульные тесты Maven с помощью HSQLDB, DBUNIT, UNITILS, Hibernate, Spring

StackOverflow https://stackoverflow.com/questions/3788174

Вопрос

У меня большой многомодульный проект Maven с тысячами испытаний. Каждое тестовые нагрузки DAOS, SERVICES и т. Д. Использование аннотации SpringapplationContext. Моя конфигурация Unitils выглядит так:

database.driverClassName=org.hsqldb.jdbcDriver
database.url=jdbc:hsqldb:file:mytestdb
database.schemaNames=PUBLIC
database.userName=sa
database.password=
database.dialect=hsqldb
unitils.modules=database,dbunit,hibernate,inject,spring
# custom version of HsqldbDbSupport which calls "SET REFERENTIAL_INTEGRITY FALSE"
org.unitils.core.dbsupport.DbSupport.implClassName.hsqldb=my.company.unitils.HsqldbDbSupport
org.dbunit.dataset.datatype.IDataTypeFactory.implClassName.hsqldb=org.dbunit.ext.hsqldb.HsqldbDataTypeFactory
org.unitils.dbmaintainer.structure.ConstraintsDisabler.implClassName=org.unitils.dbmaintainer.structure.impl.DefaultConstraintsDisabler
# custom version of CleanInsertLoadStrategy which calls "DatabaseUnitils.disableConstraints();"
DbUnitModule.DataSet.loadStrategy.default=my.company.unitils.DataSetLoadStrategy
HibernateModule.configuration.implClassName=org.hibernate.cfg.AnnotationConfiguration
dbMaintainer.disableConstraints.enabled=true
dbMaintainer.cleanDb.enabled=true
dbMaintainer.generateDataSetStructure.enabled=false
dataSetStructureGenerator.xsd.dirName=target/xsd
dbMaintainer.autoCreateExecutedScriptsTable=true
updateDataBaseSchema.enabled=false
dbMaintainer.fromScratchEnabled=true

Моя конфигурация Hibernate выглядит так:

hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.dialect=org.hibernate.dialect.HSQLDialect
hibernate.connection.autocommit=false
hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
hibernate.cache.use_structured_entries=false
hibernate.generate_statistics=false

Когда я запускаю тесты, 2 ГБ, выделенные для кучи, в конечном итоге заполняются. Prengen достигает около 400 МБ. Глядя на свалку кучи, карьера, java.lang.string. а также java.lang.string [ занимает около 40% от общего количества экземпляров.

Когда я точелю проверить несколько из этих случаев, корневые следы GC обратно к:

  • Диспетчер Spring Context (в форме экстрактов контекста XML)
  • Sessionactory (в виде запросов)

Я хотел бы оптимизировать эти 2 вещи, а я думать Они соответственно вызваны:

  • Каждый тест имеет аннотацию @springapplationContext
  • Каждый тест также использует аннотацию Unitils @dataset для загрузки данных для этого теста.

Примечание, я использую JDBC: HSQLDB: файл для разгрузки некоторых данных выключения кучи (то есть вместо JDBC: HSQLDB: MEM)

Версии:
hsqldb 1.8.0.7.
Весна 3.0.4
Unitils 3.1.

PS. Может кто-то с рейтингом 1500+ Пожалуйста, пометите этот вопрос с «Unitils»?

Это было полезно?

Решение

Если память взята с помощью данных, хранящихся в базе данных, вы можете сделать базу данных использовать таблицы на основе дисков, чтобы уменьшить использование памяти. Это может быть указано в URL базы данных:

database.url = JDBC: HSQLDB: файл: mytestdb; hsqldb.default_table_type = кэшированный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top