Thanks Armin. flush() fixes the problem. I just tried upgrading to
1.0.2, but that doesn't appear to fix the problem. I can live with the
flush() workaround until that is solved.
Thanks again, I appreciate your help.
Colin
Armin Waibel wrote:
Colin Kilburn wrote:
Hi Armin, thanks for the response.
I'm using OJB 1.0.1. I've never noticed the TransactionExt.flush()
method. Calling it does seem to fix the problem. I do have 2
questions, however:
1. the javadoc says flush() is very similar to
Transaction.checkpoint(). How do they differ?
flush() only writes the objects to DB, connection still remain.
checkpoint() write objects and commit the connection
both methods keep the locks.
and would it be preferable to call checkpoint() instead?
Nope, because after checkpoint no rollback is possible.
(calling checkpoint() seems to
work as well)
2. is calling flush() expensive?
Not really, compared with the write to the DB.
(I have a wrapper around all my lock() calls, would it be excessive
to call flush() after every lock(), even when it's not needed?
In this case I would expect an performance decrease. A performance
test case should shed some light on this.
In OJB 1.0.2 the odmg-api is completely refactored and many bugs are
fixed. I assume that your bi-directional problem will be solved in
this version (take care of new metadata settings and properties).
regards,
Armin
Colin
Armin Waibel wrote:
Hi Colin,
which version of OJB do you use?
Did you try to use TransactionExt.flush() calls to separate the calls
> beginTxn();
>
> B b = new B();
>
> a.setCurrentB(b);
>
> lock(b); // corresponds to an INSERT into B's table
((TransactionExt) tx).flush();
> lock(a); // corresponds to an UPDATE on A's table, with a FK
reference
> to the just-inserted B
>
> commitTxn();
regards,
Armin
Colin Kilburn wrote:
Hi All,
I'm currently having a problem with reordering of written objects
done by the org.apache.ojb.odmg.ObjectEnvelopeTable.reorder()
method. I have implicit locking off, and I always "lock" objects
in the order they would have to in order to maintain referrential
integrity. That is, I don't think I would have a problem if I
could disable "reordering" before committing a transaction. Is
there a way to disable reordering?
The following is an attempt to describe my situation:
I currently have a bi-directional relationship between two
objects. Say I have two classes A and B:
class A {
private B currentB;
}
class B {
private A a;
}
An A can have multiple B's, but it keeps a pointer to the current
B, which is updated every time a new B for that A is created.
This bi-directional relationship seems to cause problems for the
ObjectEnvelopeTable.reorder() method. I.e., when doing the
following (pseudocode):
beginTxn();
B b = new B();
a.setCurrentB(b);
lock(b); // corresponds to an INSERT into B's table
lock(a); // corresponds to an UPDATE on A's table, with a FK
reference to the just-inserted B
commitTxn();
What ends up happening is that the UPDATE is happening before the
INSERT, which fails because currentB's id is not yet defined. By
playing with the order that I lock those objects and others within
the transaction, I can sometimes get them to go in the right order,
but this is hokey. The problem resurfaces when tearing down my
unit tests, as the reordering at delete time can also get messed
up. The following thread describes a similar problem to mine.
http://www.mail-archive.com/[email protected]/msg05317.html
Anyway, I think if I could disable reordering, perhaps in the
OJB.properties or something, I would cease to have this problem.
The other obvious (but not really acceptable) solution would be to
do these writes in separate transactions, making reorder()'s
effects harmless.
Thanks in advance for any help,
Colin
---------------------------------------------------------------------
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]
---------------------------------------------------------------------
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]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]