[odb-users] query results not being cached?

Boris Kolpackov boris at codesynthesis.com
Thu Jun 7 03:11:32 EDT 2012


Hi Craig,

Burton, Craig <crburton at tnsi.com> writes:

> Under many circumstances, our application expects to find exactly zero
> or one instance for many specific queries, but finding two or more would
> lead to an error scenario. Application logic is the following in many
> such cases:
> 
>         if zero instances, create a new one
>         if one instance, update the one found in the db
>         if two or more, do nothing and return an error

If we can assume that the error scenario is quite rare and not performance-
sensitive, this can be handled optimally for the other two cases by doing
a "speculative" load (i.e., with the expectation that there is no error)
and then checking for the error condition:

result r = ...;

if (r.empty ())
{
  // Zero instances.
}
else
{
  result::iterator i (r.begin ());
  shared_ptr<MyPersistentClass> obj (i.load ());

  if (++i != r.end ())
  {
    // More than one instance (error).
    return/throw;
  }

  // One instance.
}

Boris



More information about the odb-users mailing list