【问题标题】:OutOfMemoryError: Trying to optimise Maven multi-module unit tests using HSQLDB, DBUnit, unitils, Hibernate, SpringOutOfMemoryError:尝试使用 HSQLDB、DBUnit、unitils、Hibernate、Spring 优化 Maven 多模块单元测试
【发布时间】:2010-09-24 14:43:52
【问题描述】:

我有一个包含数千个测试的大型多模块 Maven 项目。 每个测试使用 SpringApplicationContext 注解加载 DAO、服务等。 我的 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

当我运行测试时,分配给堆的 2GB 最终会填满。 Permgen 达到大约 400MB。 看堆转储,charjava.lang.Stringjava.lang.String[]占总数的40%左右实例。

当我抽查其中一些实例时,GC 根可以追溯到:

  • Spring 上下文管理器(以上下文 XML 提取的形式)
  • SessionFactory(以查询的形式)

我想优化这两件事,我认为它们分别是由以下原因引起的:

  • 每个测试都有一个@SpringApplicationContext 注解
  • 每个测试还使用 unitils @DataSet 注释来加载该测试的数据。

注意,我使用 jdbc:hsqldb:file 从堆中卸载一些数据(即,而不是使用 jdbc:hsqldb:mem)

版本:
hsqldb 1.8.0.7
Spring 3.0.4.RELEASE
单元 3.1

PS 有 1500+ 评分的人可以用“unitils”标记这个问题吗?

【问题讨论】:

  • 这没有回答问题,但会话工厂中的查询是 IMO 命名查询和实体上 CRUD 的查询,它们与 @DataSet 注释无关(DbUnit 使用 JDBC )。
  • 我无法添加标签 unitils:最多有 5 个标签

标签: hibernate spring hsqldb out-of-memory dbunit


【解决方案1】:

如果内存被数据库中存储的数据占用,可以让数据库使用基于磁盘的表来减少内存使用。这可以在数据库 URL 上指定:

database.url=jdbc:hsqldb:file:mytestdb;hsqldb.default_table_type=cached

【讨论】:

  • 好的,我已经选择了一个测试 MySQL 实例来进行集成测试。单元测试使用内存中的数据库,但在测试完成时会删除他们保存的所有内容。
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多