Hi Jacques,
Jacques Desmazieres wrote:
Hi,
I have an application working with OJB 1.0.1 and OSCache / JGroups and I am currently moving to OJB 1.0.3 in order to use ObjectCacheTwoLevelImpl cache implementation. And unfortunately I am facing several issues :
- first I have cut/past the source code of the ObjectCacheOSCacheImpl.java class, and sometimes the application hangs ! I finally sorted this by fixing the code, adding a call "cache.cancelUpdate(oid.toString());" in the catch block of lookup method.
thanks, I will fix this.
- and I am now facing a more serious problem. Using the ObjectCacheOSCacheImpl within a ObjectCacheTwoLevelImpl, not OScase / JGroups notification is sent. Even if I use directly the ObjectCacheOSCacheImpl, no notification is sent. On the contrary, if I used my previous version of the ObjectCacheOSCacheImpl class, those one implementing ObjectCache, it works fine, notifications are sent. Of course, all of my OJB access are within a transaction, started with a PersistenceBroker.startTransaction.
Any idea, am I missing something or is there a bug ?
Any warnings, error messages on startup of OJB?
Did you enable debug-logging level for ObjectCacheTwoLevelImpl, will objects be cached?
Do you use a debugger to track method acces in ObjectCacheOSCacheInternalImpl?
Are you sure that the oscache.properties file is correct and in classpath? Any duplicate oscache.properties files in classpath?
regards, Armin
Jacques Desmazieres
Here is an extract of my repository-jdbc-connection.xml file:
<jdbc-connection-descriptor jcd-alias="Convergence" default-connection="true" platform="Hsqldb" jdbc-level="2.0" driver="org.hsqldb.jdbcDriver" protocol="jdbc" subprotocol="hsqldb" dbalias="hsql://localhost:9001" username="sa" password="">
<!- this works fine : ObjectCacheOSCacheImpl implements ObjectCache --> <object-cache class="com.is2france.framework.middleware.services.ObjectCacheOSCacheImpl"/>
<!- this does not work : ObjectCacheOSCacheInternalImpl implements ObjectCacheInternal --> <!-- <object-cache class="com.is2france.framework.middleware.services.ObjectCacheOSCacheInterna lImpl"/> -->
<!- this does not work --> <!-- <object-cache class="org.apache.ojb.broker.cache.ObjectCacheTwoLevelImpl"> <attribute attribute-name="cacheExcludes" attribute-value=""/> <attribute attribute-name="applicationCache" attribute-value="com.is2france.framework.middleware.services.ObjectCacheOSCa cheInternalImpl"/> <attribute attribute-name="copyStrategy" attribute-value="org.apache.ojb.broker.cache.ObjectCacheTwoLevelImpl$CopyStr ategyImpl"/> </object-cache>-->
<connection-pool maxActive="50" maxIdle="-1" maxWait="200" whenExhaustedAction="1" timeBetweenEvictionRunsMillis="-1" testOnBorrow="false" testOnReturn="false" testWhileIdle="false" validationQuery="select count(*) from OJB_HL_SEQ" />
<sequence-manager className="org.apache.ojb.broker.util.sequence.SequenceManagerHighLowImpl"> <attribute attribute-name="grabSize" attribute-value="10"/> <attribute attribute-name="globalSequenceId" attribute-value="false"/> </sequence-manager> </jdbc-connection-descriptor>
And the implementation of ObjectCacheOSCacheInternalImpl
public class ObjectCacheOSCacheInternalImpl implements ObjectCacheInternal { private Logger log = Logger.getLogger(ObjectCacheOSCacheInternalImpl.class); private static GeneralCacheAdministrator admin = new GeneralCacheAdministrator(); private static final int REFRESH_PERIOD = com.opensymphony.oscache.base.CacheEntry.INDEFINITE_EXPIRY;
public ObjectCacheOSCacheInternalImpl(PersistenceBroker broker, Properties prop) { }
public void cache(Identity oid, Object obj) { try { admin.putInCache(oid.toString(), obj); } catch (Exception e) { admin.cancelUpdate(oid.toString()); log.error("Error while try to cache object: " + oid, e); } }
public void doInternalCache(Identity oid, Object obj, int type) { cache(oid, obj); }
public boolean cacheIfNew(Identity oid, Object obj) { boolean result = false; Cache cache = admin.getCache(); try { cache.getFromCache(oid.toString()); } catch (NeedsRefreshException e) { try { cache.putInCache(oid.toString(), obj); result = true; } catch (Exception e1) { cache.cancelUpdate(oid.toString()); log.error("Error while try to cache object: " + oid, e); } } return result; }
public Object lookup(Identity oid) { try { return admin.getFromCache(oid.toString(), REFRESH_PERIOD); } catch (NeedsRefreshException e) { // not found in cache if (log.isDebugEnabled()) log.debug("Not found in cache: " + oid); admin.cancelUpdate(oid.toString()); return null; } catch (Exception e) { log.error("Unexpected error when lookup object from cache: " + oid, e); admin.cancelUpdate(oid.toString()); return null; } }
public void remove(Identity oid) { try { if (log.isDebugEnabled()) log.debug("Remove from cache: " + oid); admin.flushEntry(oid.toString()); } catch (Exception e) { throw new RuntimeCacheException("Unexpected error when remove object from cache: " + oid, e); } }
public void clear() { try { if (log.isDebugEnabled()) log.debug("Clear cache"); admin.flushAll(); } catch (Exception e) { throw new RuntimeCacheException("Unexpected error while clear cache", e); } } }
--------------------------------------------------------------------- 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]
