Hi Wesley,
I did a multithreaded test too - all seems ok.
Do you use a Timestamp as lock field?
Do you re-read the used object when writing fails (to get fresh object with valid lock version)?
regards, Armin
Wesley Lemke wrote:
I am now printing the ackOptLock value, but still am only getting the OptimisticLock exception the first time I run the code after I restart the servlet containter. Here is the log files of the first two runs.
*************************** START ************************ SERVLET: Starting ClientAdderDelay SERVLET: Starting ClientAdder SERVLET: Joining to ClientAdder CLIENTADDERDELAY: Before Update: 00001:120 CLIENTADDERDELAY: Sleeping for 5000 millis CLIENTADDER: Before Update: 00001:120 CLIENTADDER: Changing name to 00000: 120 CLIENTADDER: After Update: 00000:121 SERVLET: Joingin to ClientAdderDelay CLIENTADDERDELAY: Changing name to 00000:120 CLIENTADDERDELAY: (121) org.apache.ojb.broker.OptimisticLockException: Object has been modified by someone else CLIENTADDERDELAY: After Update: 00000:121 *************************** END ************************
*************************** START ************************ SERVLET: Starting ClientAdderDelay SERVLET: Starting ClientAdder SERVLET: Joining to ClientAdder CLIENTADDERDELAY: Before Update: 00000:121 CLIENTADDERDELAY: Sleeping for 5000 millis CLIENTADDER: Before Update: 00000:121 CLIENTADDER: Changing name to 00001: 121 CLIENTADDER: After Update: 00001:122 SERVLET: Joingin to ClientAdderDelay CLIENTADDERDELAY: Changing name to 00001:122 CLIENTADDERDELAY: After Update: 00001:123 *************************** END ************************
Everything looks the same, to me except the first time the exception is thrown, and the database is only updated once, the second time the exception isn't thrown and the database is updated twice.
Does anyone else have any suggestions on what I should try next?
On Fri, 3 Dec 2004 10:25:04 +0100, Alessandro Colantoni <[EMAIL PROTECTED]> wrote:
Hi Wesley. I don't think the problem is the new connection. It looks like thread B do his job (the second time, of course) after thread A has done his one. That's should be the reason you don't get the optimistic lock Exception the second time (I don't see it). You should print the value of the ackOptLock parameter to have more informations. I hope this help
-----Mensaje original----- De: Wesley Lemke [mailto:[EMAIL PROTECTED] Enviado el: jueves, 02 de diciembre de 2004 22:51 Para: OJB Users List Asunto: Optimistic Locking Problem.
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]
--------------------------------------------------------------------- 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]
