In order to work effectively with db4o you should understand the concept of Activation. Activation controls the amount of objects loaded into the memory. There are two main pitfalls that you should be aware about.
One common pitfall is to access unactivated objects. This usually results in null pointer exceptions or invalid values. This happens when you navigate beyond the activated object-graph area. For example, we have a complex relationships and follow them:
final Person jodie = queryForJodie(container); Person julia = jodie.mother().mother().mother().mother().mother(); // This will print null // Because julia is not activated // and therefore all fields are not set System.out.println(julia.getName()); // This will throw a NullPointerException. // Because julia is not activated // and therefore all fields are not set String joannaName = julia.mother().getName();
This will result in a exception. Because by default db4o only activates objects up the a depth of 5. This means that when you load an object, that object and all objects which are reachable via 4 references are activated.
There are multiple solutions to this issue.
Having a high activation-depth makes working with db4o much easier. However activation can take a long time with deeper object graphs and become a serious performance bottleneck. The same applies when using cascade activation on almost all types. To reduce the time spend on activating objects, you need to be more selective about what to activate and what not.