We are adding optimistic locking to our application. To test it out I
have made a simple test case. The application spawns two threads.
Thread A (ClientAdderDelay): Reads an object from the database. It
then checks the name of the ojbect. If the name was 00000 it changes
it to 00001 and if the name was 00001 it changes it to 00000. The
thread sleeps for 5 seconds and then stores the object.
Thread B (ClientAdder): Does the same thing, but doesn't sleep 5
seconds between the read/store.
The main servlet starts thread A, then sleeps for 1 second and starts thread B.
The very first time I run the application everything works as it
should, Thread A and B both read 00000 from the database. Thread B
then updates the row to be 00001. Thread A gets and OptimisticLock
exception when it tries to store the object.
However all subsequent times that I run the application Thread A will
get the correct value from the database but thread B will get the
opposite value. I am attaching the output, which will hopefully make
this more understandable. The one difference I see is that the
Datasource gets a new connection the first time the Servlet is run,
but not the second...I wouldn't think that this would matter?
OUTPUT:
[12/2/04 15:47:56:436 CST] 797e3663 SystemErr R
*************************** START ************************
[12/2/04 15:47:56:466 CST] 797e3663 SystemErr R SERVLET: Starting
ClientAdderDelay
[12/2/04 15:47:56:466 CST] 797e3663 SystemErr R SERVLET: Sleeping
1000 millis
[12/2/04 15:47:56:896 CST] 6de77661 Config E
com.opensymphony.oscache.base.Config Error reading
/oscache.properties in CacheAdministrator.loadProps()
java.lang.NullPointerException
[12/2/04 15:47:56:906 CST] 6de77661 Config E
com.opensymphony.oscache.base.Config Ensure the /oscache.properties
file is readable and in your classpath.
[12/2/04 15:47:56:916 CST] 6de77661 GeneralCacheA I
com.opensymphony.oscache.general.GeneralCacheAdministrator
Constructed GeneralCacheAdministrator()
[12/2/04 15:47:56:916 CST] 6de77661 GeneralCacheA I
com.opensymphony.oscache.general.GeneralCacheAdministrator Creating
new cache
[12/2/04 15:47:58:469 CST] 6de77661 DSConfigurati W DSRA0174W:
Warning: GenericDataStoreHelper is being used.
[12/2/04 15:47:58:629 CST] 6de77661 ConnectionFac I J2CA0122I:
Resource reference jdbc/ao79 could not be located, so default values
of the following are used: [Resource-ref settings]
res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: true (SHAREABLE)
res-resolution-control: 999 (undefined)
[Other attributes]
isCMP1_x: false (not CMP1.x)
isJMS: false (not JMS)
[12/2/04 15:47:58:669 CST] 6de77661 ConnectionFac I J2CA0107I:
Component-managed authentication alias not specified for connection
factory or datasource MySql Datasource on ao79.
[12/2/04 15:47:58:699 CST] 4b22f67d ConnectionFac I J2CA0122I:
Resource reference jdbc/ao79 could not be located, so default values
of the following are used: [Resource-ref settings]
res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: true (SHAREABLE)
res-resolution-control: 999 (undefined)
[Other attributes]
isCMP1_x: false (not CMP1.x)
isJMS: false (not JMS)
[12/2/04 15:47:58:699 CST] 6de77661 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:47:58:709 CST] 4b22f67d ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:47:57:477 CST] 797e3663 SystemErr R SERVLET: Starting
ClientAdder
[12/2/04 15:47:57:477 CST] 797e3663 SystemErr R SERVLET: Joining
to ClientAdder
[12/2/04 15:47:59:170 CST] 4b22f67d WSRdbDataSour u Database version is
3.23.41
[12/2/04 15:47:59:170 CST] 4b22f67d WSRdbDataSour u JDBC Driver version is
mysql-connector-java-3.0.15-ga (
$Date: 2004/08/09 22:15:11 $, $Revision: 1.27.2.43 $ )
[12/2/04 15:47:59:250 CST] 4b22f67d ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:47:59:250 CST] 6de77661 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:47:59:530 CST] 4b22f67d SystemErr R CLIENTADDER:
Before Update: 00000<br>
[12/2/04 15:47:59:560 CST] 4b22f67d SystemErr R CLIENTADDER:
Changing name to 00001
[12/2/04 15:47:59:560 CST] 6de77661 SystemErr R CLIENTADDERDELAY:
Before Update: 00000<br>
[12/2/04 15:47:59:560 CST] 6de77661 SystemErr R CLIENTADDERDELAY:
Sleeping for 5000 millis
[12/2/04 15:47:59:570 CST] 4b22f67d ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:47:59:570 CST] 4b22f67d ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:47:59:590 CST] 4b22f67d SystemErr R CLIENTADDER:
After Update: 00001<br>
[12/2/04 15:47:59:590 CST] 797e3663 SystemErr R SERVLET: Joingin
to ClientAdderDelay
[12/2/04 15:48:04:557 CST] 6de77661 SystemErr R CLIENTADDERDELAY:
Changing name to 00001
[12/2/04 15:48:04:617 CST] 6de77661 SystemErr R
CLIENTADDERDELAY:org.apache.ojb.broker.OptimisticLockException: Object
has been modified by someone else
[12/2/04 15:48:04:617 CST] 6de77661 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:48:04:627 CST] 6de77661 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:48:04:637 CST] 6de77661 SystemErr R CLIENTADDERDELAY:
After Update: 00001<br>
[12/2/04 15:48:04:637 CST] 797e3663 SystemErr R
*************************** END ************************
[12/2/04 15:48:47:729 CST] 797e3663 SystemErr R
*************************** START ************************
[12/2/04 15:48:47:729 CST] 797e3663 SystemErr R SERVLET: Starting
ClientAdderDelay
[12/2/04 15:48:47:729 CST] 797e3663 SystemErr R SERVLET: Sleeping
1000 millis
[12/2/04 15:48:47:779 CST] 1ec7f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:48:47:840 CST] 1ec7f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:48:47:850 CST] 1ec7f672 SystemErr R CLIENTADDERDELAY:
Before Update: 00001<br>
[12/2/04 15:48:47:850 CST] 1ec7f672 SystemErr R CLIENTADDERDELAY:
Sleeping for 5000 millis
[12/2/04 15:48:48:931 CST] 797e3663 SystemErr R SERVLET: Starting
ClientAdder
[12/2/04 15:48:48:931 CST] 797e3663 SystemErr R SERVLET: Joining
to ClientAdder
[12/2/04 15:48:48:931 CST] 1ec0f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:48:49:031 CST] 1ec0f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:48:49:041 CST] 1ec0f672 SystemErr R CLIENTADDER:
Before Update: 00000<br>
[12/2/04 15:48:49:041 CST] 1ec0f672 SystemErr R CLIENTADDER:
Changing name to 00001
[12/2/04 15:48:49:051 CST] 1ec0f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:48:49:061 CST] 1ec0f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:48:49:081 CST] 1ec0f672 SystemErr R CLIENTADDER:
After Update: 00001<br>
[12/2/04 15:48:49:081 CST] 797e3663 SystemErr R SERVLET: Joingin
to ClientAdderDelay
[12/2/04 15:48:52:857 CST] 1ec7f672 SystemErr R CLIENTADDERDELAY:
Changing name to 00001
[12/2/04 15:48:52:857 CST] 1ec7f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
allocateMCWrapper.
[12/2/04 15:48:52:867 CST] 1ec7f672 ConnectionMan W J2CA0075W: An
active transaction should be present while processing method
initializeForUOW.
[12/2/04 15:48:52:877 CST] 1ec7f672 SystemErr R CLIENTADDERDELAY:
After Update: 00001<br>
[12/2/04 15:48:52:877 CST] 797e3663 SystemErr R
*************************** END ************************
Let me know if any more information would be helpful...
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]