Search code examples
javadatabasedb4o

DB4O database size growing on updating objects


I've a java web server application which updates objects to the database every 10 seconds or so.

I've noticed that when updating, even if no changes are applied,almost every time the size of the database grows a few KB's.

I've used their example here: http://community.versant.com/documentation/reference/db4o-8.0/java/tutorial/docs/Structured.html#outline39

I tried to defrag the database but this does not reduce to its original size with the same amount of objects in it.

Can anyone tell me how to prevent this/what I'm possibly doing wrong?

EDIT:

This is the part of my code where I update or store a object (Device in this case):

        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();
        }
    }

But now I found out using the Eclipse plugin db4o database browser that the Location class which is in a Device object is updated AND stored again in the database.

So I have 2 Devices and 2 Locations in the database at first, after the first update there are 2 Devices and 4 Locations in the database!! This is driving me nuts!

Does anyone know why this happens?


Solution

  • Just to check:

    Do you assign new objects and collections (which are not stored yet) to fields of the update objects. Then db4o will take those objects and store them as well. But the object which was referenced before stays in the database unless you delete it.

    This isn't the case for 'value' objects like Strings and primitives.

    Anyway in general I would expect that the database first grows. The reason is that db4o stores a updated at a new location. However the old location should be marked as free and be reused for new objects / other updates. At least when de-fragmenting the space should be freed.