我正在使用db4o 8.1的可嵌入版本。问题是当我检索一个对象并仅调用一个属性集时,它似乎将值持久保存在缓存中,即使我尝试通过ID进行检索,随后的检索也为我提供了相同的引用。

以下代码用于从db检索对象。

public Customer retrieveCustomer(final String id) {
    ObjectContainer db = getDataSource();
    Customer customer = null;
    try {
        List<Customer> result = db.query(new Predicate<Customer>() {
            private static final long serialVersionUID = 1L;

            public boolean match(Customer pilot) {
                return pilot.getId().equalsIgnoreCase(id);
            }
        });
        if (result.size() > 0) {
            customer = result.get(0);
        }
    }
    catch (Exception e) {
        logger.error("Internal db failed to retrieve the object.", e);
    }
    return customer;
}


在代码的某个地方,我做了setName(“ xyz”);从“ abc”的原始值开始,我不在任何地方提交。

customer.setName("xyz"); // no commit or store


一切都很好,但是当再次从数据库中检索对象时,它给了我xyz而不是“ abc”,因为我没有存储或提交前一个对象。

当我重新启动服务器(关闭并打开数据库)时,恢复了旧值

请帮忙。

最佳答案

对于db4o新手来说,这是一个很常见的错误:)

问题是,一旦在会话中检索到,db4o将保留对该对象的引用(这是只要Store()实际上是商店或更新对象,它就可以弄清楚它的方式);因此,第二次从db获取对象时,db4o将找到已缓存的对象并将其返回(您可以了解有关此内容以及其他概念的更多信息,here)。

解决方案?取决于您的需求,但是您可以:


克隆返回的对象并更新此克隆
Open multiple sessions与数据库一起使用(db4o对嵌入式客户机进行了一些优化)。


如果您不熟悉db4o,建议使用reading this documentation

关于java - db4o重现缓存的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22459227/

10-11 22:25
查看更多