首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutOfMemoryError:尝试使用HSQLDB、DBUnit、unitils、Hibernate、Spring优化Maven多模块单元测试

OutOfMemoryError:尝试使用HSQLDB、DBUnit、unitils、Hibernate、Spring优化Maven多模块单元测试
EN

Stack Overflow用户
提问于 2010-09-24 14:43:52
回答 1查看 866关注 0票数 0

我有一个包含数千个测试的大型多模块Maven项目。每个测试都使用SpringApplicationContext注释加载DAO、服务等。我的unitils配置如下所示:

代码语言:javascript
复制
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配置如下所示:

代码语言:javascript
复制
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达到约400。查看堆转储,java.lang.Stringjava.lang.String[]约占总实例的40%,char、。

当我抽查其中几个实例时,GC根目录可以追溯到:

Spring上下文管理器(以上下文XML extracts)

  • the SessionFactory形式(以查询形式)

)

我想优化这两件事,我认为这两件事分别是由:

每个测试都有一个@SpringApplicationContext annotation

  • Each测试,它还使用unitils @DataSet注释来加载该测试的数据。

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

版本:

hsqldb 1.8.0.7

春季3.0.4

unitils 3.1

PS,有1500+评级的人能用"unitils“标记这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-24 16:04:17

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3788174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档