我有以下问题:
我有一个数据库预先填充了大量的测试数据。在每次测试运行后,我想抛弃测试程序所做的更改。我已经尝试使用嵌入式H2 DB执行此操作。我只是用原始文件覆盖数据库文件,问题就解决了。但是出现了另一个问题:如果没有作为服务器运行,H2不支持多线程。
之后我查看了HSQLDB。如果我理解正确,如果它被用作普通文件DB(不在内存中),它仍然会将DB的内容加载到内存中并在一段时间后将更改保留到磁盘。
是否有可能只将文件DB读入内存,在那里使用它并在最后丢弃任何更改?这将是完美的。使用回滚的解决方案也很棒。
谢谢, 丹尼尔
答案 0 :(得分:1)
对于H2数据库:
从脚本append ;INIT=runscript from '~/create.sql'
to the database URL加载数据库。您还可以从类路径中的资源加载脚本;为此,将~/create.sql
替换为classpath:/com/acme/init/create.sql
。如果您对更改不感兴趣,可以将其与内存数据库(jdbc:h2:mem:test;...
)结合使用。
在多线程模式下使用H2数据库append ;MULTI_THREADED=1
to the database URL。这适用于所有模式(内存,嵌入式,客户端/服务器)。
答案 1 :(得分:1)
HSQLDB有一个用于此用途的选项。
创建测试数据库后,执行SHUTDOWN。您将拥有.properties和.script文件。在.properties文件中添加以下行:
files_readonly=true
然后使用此数据库进行测试。当应用程序退出时,不需要回滚或任何特殊操作。
或者,将此附加到测试应用程序的连接URL ;files_readonly=true
请参阅本指南的这一章:
http://www.hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_db_file_mem
对于多线程应用程序测试,数据库事务模型通常是MVCC,您可以在原始数据库中设置。