Hi Armin,

I came back on TwoLevelsCache usage and CGLib usage too.

2 news : one good, one bad.

Starting with the good one :

- Using 2L cache and CGLIb with my fisrt batch, actually, it crashed because
of memory issue. You were right. I saw that with xmx256m setup, batch stoped
farther than before. Then i had a look to my code, and decided to change
loop coding. In fact, transaction was open once, and i was doing checkpoint
every record.  I changed in a begin/commit transaction every loop. And it
ran well, and fast as never. "Very good", i said to me !!

- Now the bad news : I stopped the server and relaunched it. i launched same
batch and had this error above (at start). It seems that my proxy object
cannot be loaded by a simple getByIdentity !!! Proxy class cannot be found.
So looking to my repository, i saw proxy="true" in class descriptor.Wrong ,
isn't it? I changed to  proxy="dynamic"  and  batch freezes at start now, i
guess on the first proxy read!! . i get rid of proxy="dynamic" setup and
all is working now.

So, now, i known that it's critical to work with a lot of checkpoint and
TwoLevelCacheObject implemenation. That did not occur before.  I think we
can warn all users.

So, i want well to use TwoLevelCache, it seems to fast up all, with or
without CGLib.

I cannot setup CGLib well, i setup OJB.properties ( 2 lines ), i set
proxy="dynamic" on the class-descriptor i want to break. And it freezes at
start, reading one object with a getByIdentity i guess.

I think, because CGLib never works on my application, there is something 's
wrong.
Any idea? Which release am i supposed to have ?

Big step this day. Thank you for your help. Again and again. Reaching the
goal...

Regards.








44656 WARN  [Thread-5] odmg.ObjectEnvelopeTable - Error while write objects
for tx [EMAIL PROTECTED]

org.apache.ojb.broker.PersistenceBrokerException:
org.apache.ojb.broker.metadata.MetadataException:
java.lang.ClassNotFoundException: true

 at
org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl.loadData(Unknown
Source)

 at org.apache.ojb.broker.core.proxy.ListProxyDefaultImpl.loadData(Unknown
Source)

 at
org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl.getData(Unknown
Source)

 at
org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl.iterator(Unknown
Source)

 at
org.apache.ojb.broker.core.proxy.CollectionProxyDefaultImpl.ojbIterator(Unkn
own Source)

 at org.apache.ojb.broker.util.BrokerHelper.getCollectionIterator(Unknown
Source)

 at org.apache.ojb.odmg.Image$MultipleRef.referenceProcessing(Unknown
Source)

 at org.apache.ojb.odmg.Image.performReferenceDetection(Unknown Source)

 at org.apache.ojb.odmg.ObjectEnvelope.markReferenceElements(Unknown Source)

 at org.apache.ojb.odmg.ObjectEnvelopeTable.checkAllEnvelopes(Unknown
Source)

 at org.apache.ojb.odmg.ObjectEnvelopeTable.writeObjects(Unknown Source)

 at org.apache.ojb.odmg.TransactionImpl.doWriteObjects(Unknown Source)

 at org.apache.ojb.odmg.TransactionImpl.checkpoint(Unknown Source)

 at
fr.gouv.finances.douane.dnsce.mathieu.application.tables.service.UnitesServ.
majUnites(UnitesServ.java:110)




On 2/9/06, Armin Waibel < [EMAIL PROTECTED]> wrote:
>
> Hi Bruno,
>
> Bruno CROS wrote:
> >   Hi Armin, and all
> >
> > Just to clarify my dilemma,  i just want to resume my intentions about
> > configuring my repository.
> >
> > Consider that model is done, that 90% of transactions are coded (with
> > reportQuery, and query object and a few getCollections utilizations when
>
> > update), and of course, model is complex as you can imagine (lot of
> > collections ).
> >
> > Well, according to my last experimentations on 1.0.4, i 'm confined
> myself
> > to not use TwoLevelObjectCacheImplementation (i noted a very heavy load
> when
> > retrieving object) and not use reference proxy (CGLib) (processes stops
> > after a while). sorry for that, really.
>
> as I wrote in my previous mail, it would be important to clarify if this
> is a problem relating to your object model (object handling) and less
> memory of the JVM or a bug in OJB.
>
> I did some simple tests and can't detect any problems with object
> materialization and the 2L-Cache. On materialization of objects with
> collection references and proxy=true, OJB only materialize the main
> object and set the proxy placeholder.
>
>
> > So, it appears to me that the only way to reduce loading time, is to
> break
> > some strategical relations, setting up false to many auto-retrieves.
> > Logically, i chose to  "break"  collection relation
> of  central  classes  (
> > imagine a Customer class referred by 10 others classes.) . This seems to
> > fast up all my retrieves (globally) but i known now i 'm exposed to have
> > unwanted behaviour. And that's i can't well imagine.
> >
> > So, if for my class Customer, all collection descriptors auto-retrieves
> are
> > set to false, after my object Customer1 is loaded, collections are not
> > available to read without doing retrieveAllReference(...) (or its
> friends
> > retrieveReference(....). well.Ok.
> > Now, if idecided to change this object with ODMG ( still without
> > retrieveAllReference), am i exposed to have all existing records
> populating
> > my collections to be deleted? By way of example, imagine Order class,
> > populating my collections orders in Customer. Did all of my orders
> disappear
> > ?
>
> if you update the Customer object or you simply add a new Order objects
> OJB shouldn't cause problem (I did some tests and can't detect
> problems). In the first case OJB will simply update Customer. In the
> second case OJB will insert a new Order objects.
> I tested this behavior only for 1:n references. m:n references should
> behave similar (please test it to verify). 1:1 references will cause
> problems.
>
>
> >
> > A second case : still if Customer class have a collection of Orders. If
> i
> > get Order1 of Customer1 to update it, (still without any
> > retrieveAllReference on Customer1),
> > do i have to expext that something
> > disappear ?
>
> if you only update Order1 - no.
> Anyway I recommend you to add these specific cases to your unit-test
> suite to verify OJB behavior.
>
>
>   even if Customer is never locked, just loaded and
> > (re)referenced.
>
> Don't understand, what do you mean with "just loaded and (re)referenced"?
>
> regards,
> Armin
>
> >
> > Thanks very very much for the answers.
> >
> > I hope i will not request you anymore help.
> >
> > Regards.
> >
> >
> >
> >
> >
> >
> >
> > On 2/6/06, Armin Waibel <[EMAIL PROTECTED]> wrote:
> >> Hi Bruno,
> >>
> >> Bruno CROS wrote:
> >>> About my precedent batch troubles:
> >>> In fact, a saw my model loaded from every where with all the actual
> >>> auto-retrieve="true", this means, every where !!  This means too, that
>
> >>> "back" relations are read too, circling too much. This was the cause
> of
> >> my
> >>> OutOfMemoryError.
> >>>
> >>> My model is a big one with a lot of relations, as complex as you can
> >>> imagine.
> >>>  So, i'm asking me about get rid of those auto-retrieve, to get all
> >> objects
> >>> reads faster (and avoid a clogging). But i read that for ODMG dev,
> >>> precognized settings are auto-retrieve="true" auto-update="none"
> >>> auto-delete="none".  Do i have to absolutely follow this ? If yes, why
> ?
> >>>
> >> In generally the auto-retrieve="true" is mandatory when using the
> >> odmg-api. When using it OJB take a snapshot (copy all fields and
> >> references to other objects) of each object when it's locked. On commit
> >> OJB compare the snapshot with the state of the object on commit. This
> >> way OJB can detect changed fields, new or deleted objects in references
>
> >> (1:1, 1:n,m:n).
> >> If auto-retrieve is disabled and the object is locked OJB assume that
> no
> >> references exist or the existing ones are deleted although references
> >> exist and not be deleted. So this can cause unexpected behavior,
> >> particularly with 1:1 references.
> >>
> >> The easiest way to solve your problem is to use proxy-references. For
> >> 1:n and m:n you can use a collection-proxy:
> >>
> >>
> http://db.apache.org/ojb/docu/guides/basic-technique.html#Using+a+Single+Proxy+for+a+Whole+Collection
> >>
> >> For 1:1 references you can use proxies too.
> >>
> >> http://db.apache.org/ojb/docu/guides/basic-technique.html#Using+a+Proxy+for+a+Reference
>
> >> Normally this requires the usage of a interface as persistent object
> >> reference field. But when using CGLib based proxies it's not required
> >> and you can simply set proxy="true" without any changes in your source
> >> code.
> >>
> http://db.apache.org/ojb/docu/guides/basic-technique.html#Customizing+the+proxy+mechanism
> >>
> >>
> >> If you can't use proxies (e.g. in a 3-tier application) you can disable
> >> auto-retrieve if you take care and:
> >> - disable implicit locking in generally
> >> - carefully lock all objects before change it (new objects too)
> >> - before you lock an object (for update, delete,...) retrieve the
> >> references of that object using method
> >> PersistenceBroker.retrieveAllReferences(obj)/retrieveReference(...).
> >>
> >>
> >>> At start, I saw that setting auto-retrieve to "true" everywhere wasn't
> >>> solution, but all transaction and batch processes were working fine (
> >> until
> >>> 1.0.4. ), with autoretrieve on all n relations (yes!). Chance !!
> >>> But with a
> >>> little doubt, I tell to all the dev team to avoid as possible the read
> >> by
> >>> iterating collections without any reasons, prefering ReportQuery
> (single
> >>> shot) and direct object queries.
> >>> Is that the good way to have a fast and robust application ?
> >> ...yep. The fastest way to lookup a single object by PK is to use
> >> PB.getObjectByIdentity (...). If a cache is used this method doesn't
> >> require a DB round trip in most cases.
> >> http://db.apache.org/ojb/docu/tutorials/pb-tutorial.html#Find+object+by+primary+key
>
> >>
> >>
> >>
> >>> Another thing, does defaultPersistenceBroker always return the tx
> broker
> >>> when tx has begun (in 1.0.4)? That's very important.
> >>> I hope that i have not to implement with TransactionExt.getBroker
>   method.
> >>> All ours reads are with defaultPersistenceBroker.
> >> If you call PBF.defaultPB(...) OJB always return a separate PB instance
> >> (of the 'default' connection defined in jdbc-connection-descriptor)
> from
> >> the PB-pool using it's own connection.
> >> TransactionExt.getBroker always returns the current used PB instance
> (of
> >> tx). This behavior never changed.
> >> If you only do read operations with the separate PB instance you will
> >> not run into problems, except if you call tx.flush(). In that case the
> >> objects written to database will not be noticed by the separate PB
> >> instance (until tx.commit - with default DB isolation level).
> >>
> >> regards,
> >> Armin
> >>
> >>> Thank you all in advance.
> >>>
> >> ---------------------------------------------------------------------
> >> 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]
>
>

Reply via email to