Hi Andrew,
Andrew Fortier wrote:
Hi all,
I've been chasing down a bug that has been rearing it's head every now
and again. Hopefully someone on this list has an idea of what might be
going on.
Occasionally an reference from one object to another will null out
spontaneously. Example: A User object has a reference to a UserRole
object (mapped by a userRoleId field in the User table). Occasionally,
calls to user.getUserRole() will return null even though there is an
associated UserRole object in the database (in both the UserRole table
and as an id in the User table).
Thus far this has only happened when caching is enabled. We generally
use the following settings:
<object-cache class="org.apache.ojb.broker.cache.ObjectCacheDefaultImpl">
<attribute attribute-name="timeout" attribute-value="900"/>
<attribute attribute-name="autoSync" attribute-value="true"/>
<attribute attribute-name="cachingKeyType" attribute-value="0"/>
<attribute attribute-name="useSoftReferences" attribute-value="true"/>
</object-cache>
(Note: it happens more frequently if the timeout is set to ~45 seconds)
The problem seems to happen only if there are two Users logged into the
web-app at the same time, and only if they are accessing the same
project. It should be noted that the setUserRole() method is called only
once in the entire application code, when the user registers. There is
really no way that method is being called when the property is nulled out.
1. Keep in mind that ObjectCacheDefaultImpl is a shared cache, thus it
could happen that different user operate on the same object instance.
http://db.apache.org/ojb/docu/guides/objectcache.html#ObjectCacheDefaultImpl
2. If you are using versions <1.0.2 it can happen that partially
materialized objects (e.g. without populated reference) are requested by
other threads (fixed in 1.0.2).
Did you tried to use the two-level cache? Same issue?
http://db.apache.org/ojb/docu/guides/objectcache.html#ObjectCacheTwoLevelImpl
regards,
Armin
Final note: The UserRole objects are all defined statically (e.g. public
UserRole ADMIN = new UserRole("Administrator",ADMIN_ID); ) but are
persisted in the database as well.
Thanks for any input! If this is happening in your app as well perhaps
we can exchange info to help narrow down possible causes.
-= Andrew Fortier
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]