Re: Lazily column retrieval

From: Gili (cowwo..bs.darktech.org)
Date: Mon Aug 29 2005 - 13:24:04 EDT

  • Next message: Gili: "Overriding Optimistic Locking setting?"

            What about if I do this?

            begin transaction
            increment num_references using SQLTemplate
            add/remove cache entries using object queries
            end transaction

            This should ensure everything occurs from within a single transaction,
    while avoidding collisions for num_references. I assume that even if
    optimistic-locking is enabled for the table containing num_references,
    it'll be ignored if I use SQLTemplate?

            Basically I want to selectively increment num_references without any
    optimistic locking. The same goes for deleting cache entries. If I
    delete a cache entry and it has been modified since I last viewed it
    (i.e. its score changed) I expect the delete to go through anyway.

            Is there a way to control optimistic locking on a per-query basis like
    this? or am is it controlled on a per-table basis?

    Thanks,
    Gili

    Gili wrote:
    > > Well, sending an "UPDATE image_cache_stats SET num_requests =
    > > num_requests + 1" is highly unlikely to fail (your DB would have to
    > > tank, in which case there is nothing Cayenne can do).
    >
    > Regarding "UPDATE image_cache_stats SET num_requests = num_requests
    > + 1" I am curious whether Cayenne is smart enough to issue this SQL
    > statement itself or is it impossible for it to know whether I am
    > incrementing a field versus setting it to an explicit value?
    >
    >> Are you trying to limit the image_cache_stats to a set size? You could
    >> do that, adding new entries and deleting others and then do a
    >> dataContext.commitChanges(), but that seems like more trouble that it is
    >> worth.
    >>
    >> Could you not leave old entries in the image_cache_stats table do a
    >> query against it with an ORDER BY and a LIMIT to control the data coming
    >> back? I'd let the database do the work since it is good at it. If you
    >> did have a need to prune the size of the table, you could always issue a
    >> DELETE using SQLTemplate to get rid of rows that fall below a certain
    >> threshold.
    >
    >
    > That would work too but it won't guarantee the cache size is less
    > than a certain value. I *almost* do what you say though. I do ORDER BY
    > and remove rows I get back until the total cache size is under its
    > expected limit.
    >
    >> I guess what I'm saying is don't be afraid to use an SQLTemplate when
    >> you have a valid need for it (that's what I do when it makes sense).
    >> Let the database do work for you when appropriate.
    >>
    >> As for the consistency issue, as soon as you refetch the table data,
    >> you'll be up-to-date again in Cayenne. It might make sense to put all
    >> of this logic in a helper class (complete with it's own DataContext) to
    >> manage it. You should use a synchronize block around the update code to
    >> let Java serialize that portion.
    >
    >
    > But this still does not guarantee consistency. If I use two separate
    > transactions: one for incrementing num_requests, and another for
    > actually inserting/removing cache entries, there is no guarantee both
    > will succeed or fail together.
    >
    > Secondly, in the Hibernate documentation they explicitly warn not to
    > sychronize on database objects in memory because this does not guarantee
    > they won't actually get modified. The only safe place to lock on objects
    > is in the database. In Hibernate, for example, each thread sees a
    > difference object instance which points to the same database row.
    > Synchronizing in one piece of code in one application will not prevent
    > another piece of code in another application will attempting modification.
    >
    > Gili
    >

    -- 
    http://www.desktopbeautifier.com/
    



    This archive was generated by hypermail 2.0.0 : Mon Aug 29 2005 - 13:24:10 EDT