简单可靠的内存数据库,用于支持 JPA 的快速 Java 集成测试

Posted

技术标签:

【中文标题】简单可靠的内存数据库,用于支持 JPA 的快速 Java 集成测试【英文标题】:Simple and reliable in memory database for fast java integration tests with support for JPA 【发布时间】:2011-03-27 12:49:19 【问题描述】:

如果我使用内存数据库而不是 PostgreSQL,我的集成测试会运行得更快。我使用 JPA (Hibernate),我需要一个易于切换到使用 JPA、易于设置且可靠的内存数据库。它需要相当广泛地支持 JPA 和 Hibernate(如果你愿意,也可以反过来),因为我不想采用我的数据访问代码进行测试。

根据上述要求,什么数据库是最佳选择?

【问题讨论】:

【参考方案1】:

我一直在使用 HSQLDB in-memory 在 Java 中集成测试 JPA/Hibernate 持久性。启动很快,不需要任何特殊设置。

到目前为止,我在 Hibernate 中使用 HSQLDB 时看到的唯一问题是批量大小需要设置为 0,但这可能与旧版本有关。我会挖掘一下,看看能否找到该问题的详细信息。

Derby supports an in-memory mode 这些天来,它不再被标记为实验性的。

【讨论】:

鉴于对内存数据库的同等支持,我希望拥有最简单且侵入性最小的(希望零定制(persistence.xml 除外)解决方案)。谢谢! 又一票支持 HSQLDB,特别是自 V2 发布以来,v1.x 不支持 JDBC 支持的一些当前构造,例如返回自动生成的键值,但 v2 支持。跨度> 【参考方案2】:

我使用德比。一方面,每个单元测试的代码行数减少了大约 3 行,因为测试后不需要关闭。但是,您需要使用可以删除和创建表的 JPA 实现,例如 EclipseLink。

Derby 还可以从一个文件初始化一个新的内存数据库,这样您就可以拥有一个参考数据库并随时恢复到它。

不过,对于单元测试,我更喜欢在单元测试的 @Before 逻辑中创建对象例如 DBunit 实际上依赖于静态结构,重构意味着手动更改 DBunit XML,而不是依赖 Eclipse 的重构功能。

【讨论】:

【参考方案3】:

对于集成测试,我现在使用我更喜欢的H2(来自 HSQLDB 的原作者)而不是 HSQLDB。它是faster(我希望我的测试尽可能快),它有一些不错的功能,例如compatibility 模式,开发团队反应迅速(而 HSQLDB 一直处于休眠状态直到最近)。

【讨论】:

基准测试是针对持久数据存储的,内存中的结果可能会有所不同,因为大部分开销是由于数据库中的磁盘/缓存策略造成的。 H2 和 HSQLDB 之间的差异很大但并不重要。我仍然会根据易用性、最少的配置和功能进行选择。而且兼容模式功能确实看起来很吸引人。谢谢! @grigory:是的,你是对的。但即使使用持久化模式,H2 和 HSQLDB 实际上默认在内存中运行并延迟写入磁盘(以耐久性为代价)。所以数据还是很有趣的。

以上是关于简单可靠的内存数据库,用于支持 JPA 的快速 Java 集成测试的主要内容,如果未能解决你的问题,请参考以下文章

mysql Connector J 版本 8 不适用于 JPA eclipse 实体生成

使用缓存保护MySQL

使用缓存保护MySQL

教程 | 详解支持向量机SVM:快速可靠的分类算法

01Mybatis快速入门

Java中可靠的声音API,用于简单的数字样本播放