Db4o returing缓存对象

时间:2014-03-17 16:00:19

标签: java db4o

我使用的是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(&#34; xyz&#34;);来自&#34; abc&#34;的原始价值我不会在任何地方提交。

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

这里的一切都很好,但是当从db再次检索对象时,它给了我xyz而不是&#34; abc&#34;因为我没有存储或提交上一个对象。

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

请帮忙。

1 个答案:

答案 0 :(得分:1)

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

问题在于,一旦在会话中检索到,db4o将保留对该对象的引用(即当Store()确实是存储或更新时它是如何计算出来的);因此,第二次从db获取对象时,db4o将找到缓存的对象并返回它(您可以阅读更多有关此内容以及其他概念here)。

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

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

如果您是db4o的新手,我建议reading this documentation