【发布时间】:2013-06-07 14:26:26
【问题描述】:
我刚刚看到一篇文章,我们可以使用 HSQLDB 来执行此操作,但我正在考虑在内存数据库中使用 mySQL 测试我的 DAO,因为行为因数据库而异。谁能告诉我怎么做?
谢谢
【问题讨论】:
标签: mysql spring hibernate dao in-memory-database
我刚刚看到一篇文章,我们可以使用 HSQLDB 来执行此操作,但我正在考虑在内存数据库中使用 mySQL 测试我的 DAO,因为行为因数据库而异。谁能告诉我怎么做?
谢谢
【问题讨论】:
标签: mysql spring hibernate dao in-memory-database
我使用 H2 进行单元/集成测试以及开发 - 速度更快,不依赖于任何外部。 MySQL 是我的生产数据库。这就像一场完美的婚姻......
...直到并发开始,数据库开始表现不同。
每个数据库都有自己的事务隔离策略 - 大多数情况下,测试在 MySQL 上工作,但在 H2 上不工作。例如,H2 仅支持超时时间仅为 1,000 毫秒的表锁定,从而导致一些线程失败,因此我的测试不稳定。
有一些方法可以单独配置 H2(查看 H2's transaction isolation levels),但是我还没有测试 MVCC 选项。
我会及时通知你的。
PS。故事的寓意 - 创建并发集成测试!
更新:它有效!我创建了如下数据源:
final DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("org.h2.Driver");
ds.setUrl("jdbc:h2:~/testdb;MVCC=TRUE");
ds.setUsername("sa");
ds.setPassword("sa");
return ds;
MVCC 标志就像一个魅力,但是我在使用内存中 h2:mem 时遇到了一些问题,因为它在每个连接中都是易失的(因此,每当 Hibernate 重新尝试连接时,模式就会被清除)。我不得不退回到基于文件的数据库(这对我来说不是什么大问题)。
【讨论】:
Spring 仅支持 H2、HSQL 和 Derby 作为内存数据库实现。如果您真的对使用 MySql 本身进行测试感兴趣,您应该能够针对外部 MySql 数据库服务器运行单元测试,在本地或不同的机器上运行。
【讨论】: