我们有两个H2内存数据库,我们连接到这些数据库进行测试。为此,我们最初有一个context.xml文件,其中包含连接到每个数据库的信息,这正常工作。
现在我们必须拆分context.xml文件,因此有两个上下文文件,因为我们希望关闭一个上下文,同时保持另一个上下文打开。
问题在于,现在将这些分离出来并在运行测试时创建两个单独的ClassPathXmlApplicationContext对象数据在测试之间是持久的。这最初在使用一个上下文,关闭它并创建新上下文时起作用。现在将它们分离出来并关闭两个上下文并不能删除与数据库的所有连接。这意味着H2不会创建新数据库。
过去几天我一直在四处寻找,但我无法找到有关任何类似案件的任何信息。
这用于数据库URL以将其设置为使用内存数据库:
jdbc:h2:mem:db1;
jdbc:h2:mem:db2;
我们的服务文件的简化版本:
public static Provider1 getProvider1() {
if (SERVICE_1 == null) {
initialise1();
}
return SERVICE_1;
}
public static Provider2 getProvider2() {
if (SERVICE_2 == null) {
initialise2();
}
return SERVICE_2;
}
private static void initialise1() {
try {
CONTEXT_1 = new ClassPathXmlApplicationContext("classpath:/Context1.xml"); //$NON-NLS-1$
} catch (BeanCreationException ex) {
}
SERVICE_1 = CONTEXT_1.getBean(Provider1.class);
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
if (CONTEXT_1 != null) {
CONTEXT_1.close();
}
}
});
}
private static void initialise2() {
try {
CONTEXT_2 = new ClassPathXmlApplicationContext("classpath:/Context2.xml"); //$NON-NLS-1$
} catch (BeanCreationException ex) {
}
SERVICE_2 = CONTEXT_2.getBean(Provider2.class);
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
if (CONTEXT_2 != null) {
CONTEXT_2.close();
}
}
});
}
public static void shutDown(){
CONTEXT_1.close();
CONTEXT_2.close();
SERVICE_1 = null;
SERVICE_2 = null;
}
在测试方法中,调用初始化shutdown
方法,然后调用getProvider1
。这应该关闭与数据库的两个连接,但在下一个测试方法中它具有来自先前测试的数据。我知道每个上下文应该有一个单独的initialise
和shutdown
方法,但这可以作为一个例子。
如果需要任何其他信息,请通知我。我尝试过小规模再创作,但我无法做到。任何可以帮助我解决问题的想法都是完美的,因为它很不寻常。
这可能是什么原因造成的?