出于显而易见的原因,我决定停止使用 H2(我在生产中使用 Oracle,兼容模式是假的)。因此,我编写了简单的测试框架,它为我的应用程序中的每个测试执行以下操作:
生成随机用户名(在下面的示例中是
test_user
)。创建新用户和表空间:
create tablespace test_user_ts datafile 'test_user_tabspace.dat' size 10M reuse autoextend on next 500K; create temporary tablespace test_user_ts_tmp tempfile 'test_user.tabspace_temp.dat' size 10M reuse autoextend on next 500K; create user test_user identified by test_password default tablespace test_user_ts temporary tablespace test_user_ts_tmp; grant create session to test_user; grant all privileges to test_user;
用测试数据填充数据库。
运行测试。
清理:
drop user test_user cascade; drop tablespace test_user_ts_tmp; drop tablespace test_user_ts;
问题是阶段 1-3 很慢。我怎样才能使它们尽可能快?有没有办法将现有的数据库模式复制到另一个数据库模式?
数据库版本:Oracle 11g
我可以完全控制 Oracle 实例。它在我的开发机器上运行在一个 vagrant 图像上。
加速2:
加速3:
你如何用测试数据填充数据库?
INSERT INTO AS SELECT...
在 EE 中你可以使用并行查询,在 SE 中你必须将它拆分并启动多个外部线程。优化5:
drop tablespace test_user including contents and datafiles;
。此命令也将删除数据文件。在内存中(EDIT1)
实际上,我想到了另一种可能的方法。
使用表空间创建数据库
n
。测试框架将维护这些表空间的池。
每个测试都会从池中租用一个表空间。
当返回表空间时,框架会清理它并使其准备好供另一个测试使用。
如果所有表空间都在使用中,那么框架只会创建一个新表空间!
你怎么看?
它可以独立于 @ora-600 提到的优化来完成。