Размер базы данных DB4O увеличивается при обновлении объектов - PullRequest
1 голос
/ 10 ноября 2011

У меня есть приложение веб-сервера Java, которое обновляет объекты в базе данных каждые 10 секунд или около того.

Я заметил, что при обновлении, даже если не применяются никакие изменения, почти каждый раз, когда размер базы данных увеличивается на несколько КБ.

Я использовал их пример здесь: http://community.versant.com/documentation/reference/db4o-8.0/java/tutorial/docs/Structured.html#outline39

Я пытался дефрагментировать базу данных, но это не уменьшало ее до исходного размера с тем же количеством объектов в ней.

Может кто-нибудь сказать мне, как предотвратитьэто / что я, возможно, делаю неправильно?

РЕДАКТИРОВАТЬ:

Это часть моего кода, где я обновляю или сохраняю объект (устройство в данном случае):

        try {
        LinkedList<Device> lDevices = Sense.getDevices();
        if (lDevices.size() == 0) {
            return;
        }

        db = Db4o.getDatabaseClient();

        for (Device device : lDevices) {
            List<Device> query = db.queryByExample(new Device(device.getDeviceId()));

            if (query.size() == 1) {
                //store changes
                Device found = query.get(0);

                found.setBatteryLevel(device.getBatteryLevel());
                found.setLastknownLocation(device.getLastknownLocation());
                found.setType(device.getType());

                db.store(found);
            } else {
                // store new Device
                db.store(device);
            }
        }
    } catch (Exception e) {
    } finally {
        if (db instanceof ObjectContainer) {
            db.close();
        }
    }

Но теперь я узнал с помощью браузера базы данных плагина Eclipse db4o, что класс Location, находящийся в объекте Device, обновляется и снова сохраняется в базе данных.

Итак, у меня 2 устройства и 2 Locations всначала база данных, после первого обновления в базе 2 устройства и 4 местоположения !!Это сводит меня с ума!

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Просто чтобы проверить:

Назначаете ли вы новые объекты и коллекции (которые еще не сохранены) для полей объектов обновления.Затем db4o возьмет эти объекты и сохранит их.Но объект, на который ссылались ранее, остается в базе данных, если вы его не удалите.

Это не относится к объектам 'value', таким как Strings и примитивы.

В общем, я бы ожидал, что база данных сначала будет расти.Причина в том, что db4o хранит обновленные данные в новом месте.Однако старое местоположение должно быть помечено как свободное и использоваться повторно для новых объектов / других обновлений.По крайней мере, при удалении фрагмента пространство должно быть освобождено.

0 голосов
/ 10 ноября 2011

Когда вы обновляете объекты, db4o фактически дублирует их и помещает пространство, используемое для «старого» объекта, в список свободного места.

Каждый раз при повторной записи db4o будет пытаться повторно использовать пространство из этого " свободного места ".

Так что ожидается этот рост.

Лучший

Адриано

...