【问题标题】:Db4o returing cached objectDb4o 正在返回缓存的对象
【发布时间】:2014-03-17 16:00:18
【问题描述】:

我使用的是 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

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

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

请帮忙。

【问题讨论】:

    标签: java db4o


    【解决方案1】:

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

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

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

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

    如果您是 db4o 新手,我推荐reading this documentation

    【讨论】:

    • 感谢 Vagaus 这解决了我的问题,对于使用 DB4o 的任何人来说都是必须知道的 :)
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多