Don't forget pb.close() when you're done. R
On 12/4/04 3:07 PM, "Wesley Lemke" <[EMAIL PROTECTED]> wrote: > Right now I am using the PB.beginTransactoin, and PB.commit... > > > On Sat, 04 Dec 2004 18:53:43 +0100, Armin Waibel <[EMAIL PROTECTED]> wrote: >> Hi Wesley, >> >> Wesley Lemke wrote: >> >>> I am using the integer as the lock field. On monday I can give it a >>> shot with a timestamp. >> >> Integer is fine. There is a bug when using Timestamp values in OJB1.0.1, >> so Integer is a better choice. >> >>> I just can't figure out why it works the first >>> time I run it, but then the exception is not thrown after that. Could >>> it have something to do with the data source getting a new connection >>> the first time? >>> >> >> hmm, if the used connections don't get committed side-effects could >> happen. Do you use PB-tx demarcation (PB.beginT...) (or JTA-tx when in >> managed environment)? >> >> I checked in a multithreaded optimistic locking test in CVS branch >> OJB_1_0_RELEASE >> >> http://cvs.apache.org/viewcvs.cgi/db-ojb/src/test/org/apache/ojb/broker/Optim >> isticLockingMultithreadedTest.java?rev=1.1.2.1&only_with_tag=OJB_1_0_RELEASE& >> view=markup >> >> This test (multiple threads try to update the same object) seems to work >> and case OLE when version conflict occur. >> >> regards, >> Armin >> >> >> >> >>> >>> On Fri, 03 Dec 2004 23:01:48 +0100, Armin Waibel <[EMAIL PROTECTED]> wrote: >>> >>>> 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] >>>> >>>> >>> >>> >>> --------------------------------------------------------------------- >> >> >>> 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] R -- Robert S. Sfeir Software Developer Codepuccino "Make everything as simple as possible, but not simpler." -- Einstein http://www.codepuccino.com blog: http://blogs.codepuccino.com/dude --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
