0

我正在尝试通过一个 arquillian 测试用例使用 db4o 存储一个实体,并得到一个 DatabaseClosedException:


测试集:com.walterjwhite.address.api.datastore.TestAddressDatastore

测试运行:1,失败:0,错误:1,跳过:0,经过时间:2.149 秒 <<< 失败!test_save(com.walterjwhite.address.api.datastore.TestAddressDatastore) 已用时间:0.68 秒 <<< 错误!com.db4o.internal.ObjectContainerBase.checkClosed(ObjectContainerBase.java:303) 处 com.db4o.internal.ObjectContainerBase.checkTransaction(ObjectContainerBase.java:331) 处 com.db4o.internal.ObjectContainerBase 处的 com.db4o.ext.DatabaseClosedException。 asTopLevelStore(ObjectContainerBase.java:412) at com.db4o.internal.ObjectContainerBase.storeInternal(ObjectContainerBase.java:1602) at com.db4o.internal.ObjectContainerBase.store(ObjectContainerBase.java:1584) at com.db4o.internal.ObjectContainerBase .store(ObjectContainerBase.java:1576) 在 com.db4o.internal.ObjectContainerSession.store(ObjectContainerSession.java:

@Produces
protected ObjectServer openServer(ApplicationContext applicationContext)
{
    return (Db4oClientServer.openServer("/tmp/test.db4o", 0));
}

@Produces
public ObjectContainer getObjectContainer(ObjectServer objectServer)
{
    return (objectServer.openClient());
}

对于我的测试用例,我正在使用 /tmp 中的文件创建一个对象服务器。创建文件后,对象容器会通过 setter 自动注入,否则 objectContainer 将为 null,这将是一个不同的异常。

我在代码中加入了一些调试语句,以确保在 store 调用之后才调用 dispose 方法,这样我就可以排除这个潜在的问题。

我还需要做什么来准备容器?

谢谢,

沃尔特

4

3 回答 3

1

您是否看到在 tmp 中创建了文件 test.db4o?确保您编写数据库的目录存在并且可以被尝试创建它的进程访问。

于 2011-06-21T09:14:32.163 回答
0

过去发生这种情况时,在引发此异常之前,较早的错误已关闭数据库。我的建议是在抛出此错误之前查找其他错误。

于 2011-06-21T05:59:43.753 回答
0

我想通了......我没有在我的 bean 上指定正确的范围......我编写了一个没有 Weld / CDI 的简单测试应用程序,它运行良好。ObjectServer 在打开后几乎立即关闭。

在我将其更改为适当的范围(即服务器的单例)后,它就起作用了。

沃尔特

于 2011-06-22T02:18:42.503 回答