1

我在关闭 berkeley db 上的一些商店时遇到了打开光标的例外情况:

Exception in thread "main" java.lang.IllegalStateException: Database still has 1 open cursors while trying to close.
    at com.sleepycat.je.Database.closeInternal(Database.java:462)
    at com.sleepycat.je.Database.close(Database.java:314)
    at com.sleepycat.persist.impl.Store.closeDb(Store.java:1449)
    at com.sleepycat.persist.impl.Store.close(Store.java:1058)
    at com.sleepycat.persist.EntityStore.close(EntityStore.java:626)

此错误发生在“myStore.close()”上:

public void close() throws DatabaseException {
    myStore.close();
    myDB.close();
    env.close();
}

但我没有手动打开任何光标。

我一直在寻找这个错误,但没有发现我必须做的任何特别的事情(因为我没有手动打开光标)。

所以我认为我在打开数据库时做错了。我在开店时要做的事情:

myStore = new EntityStore(env, "StoreTest", storeConfig);
PrimaryIndex<Long, MYClass> myPrimaryIndex = myStore.getPrimaryIndex(Long.class, MyClass.class);

再说一遍:我没有手动打开任何光标。

4

1 回答 1

0

对 EntityIndex.entities() 的任何调用都会打开一个游标,无论您是否将其分配给变量。因此,请确保将其分配给 EntityCursor 对象,然后调用它的 close() 方法,如下所示:

EntityCursor<Employee> cursor = primaryIndex.entities();
try {
         ...
} finally {
    cursor.close();
}

我遇到了类似的问题,这就是解决方案,也发布在 OTN 论坛上: https ://forums.oracle.com/forums/thread.jspa?messageID=10241239

于 2012-03-29T09:49:02.947 回答