All, I realized that we don�t have to load the configuration everytime , so just called JD02.createInstance(jdoDatabaseName) ;
To give me the JDO class and works fine :). Thanks Vijay -----Original Message----- From: Vijayanand Sukumar [mailto:[EMAIL PROTECTED] Sent: Wednesday, April 27, 2005 5:36 PM To: [email protected]; [EMAIL PROTECTED] Subject: RE: [castor-user] Transaction locks and muti threaded access All, Is that because the new object JDO2 is a singleton and cannot be instantiated ?. If that's the case then instead of having the JDO2 instance in the context , should I have a singleton class return a JDO instance so that it can be shared ? Something like // CastorJDODB is a singleton public class CastorJDODB { private static JDO2 jdo; private CastorJDODB() { jdo = JDO2.loadConfiguration(getClass().getClassLoader().getResource(DATABASE_FILE _NAME).toString()); jdo = JDO2.createInstance(jdoDatabaseName); } ... methods for singleton implementation ... public static final getJDO() { return jdo; } } JDO2 jdo = CastorJDODB.getJDO(); And use the jdo instance everywhere in the struts action classes instead of keeping the JDO2 class in the context . Is this approach right ? Thanks Vijay -----Original Message----- From: Vijayanand Sukumar [mailto:[EMAIL PROTECTED] Sent: Wednesday, April 27, 2005 4:53 PM To: [email protected]; [EMAIL PROTECTED] Subject: RE: [castor-user] Transaction locks and muti threaded access Hi , I have a few problems configuring JDO2 with castor 0.9.6. Any help would be greatly appreciated. I tried to initialize JDO2 in my code as snippet of database-conf xml <jdo-conf> <database name="pcpgoJdo" engine="oracle"> <jndi name="java:/comp/env/jdbc/myoracle"/> <mapping href="resources/mapping.xml" /> </database> <transaction-demarcation mode="local" /> </jdo-conf> And the code looks like JDO2.loadConfiguration(getClass().getClassLoader().getResource(DATABASE_FILE _NAME).toString()); JDO2 jdo = JDO2.createInstance(jdoDatabaseName); InitialContext initialContext = new InitialContext(); initialContext.bind(jdoJndiName, jdo); db.begin(); Map cptCodes = LoadDB.loadCPTCodes(db); db.commit(); // works fine until here when I do a initialContext.lookup(jdoJndiName); it gives the following exception java.lang.IllegalAccessException: Class javax.naming.spi.NamingManager can not access a member of class org.exolab.castor.jdo.JDO2 with modifiers "private" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.Class.newInstance0(Class.java:302) at java.lang.Class.newInstance(Class.java:261) at javax.naming.spi.NamingManager.getObjectFactoryFromReference(NamingManager.j ava:146) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:299) at org.apache.naming.NamingContext.lookup(NamingContext.java:791) at org.apache.naming.NamingContext.lookup(NamingContext.java:151) at org.apache.naming.SelectorContext.lookup(SelectorContext.java:136) at javax.naming.InitialContext.lookup(InitialContext.java:347) at com.PCPgo.prm.web.database.PcpgoServlet.LoadJdoinContext(PcpgoServlet.java:2 48) Am I missing something here ? Thanks Vijay -----Original Message----- From: Ralf Joachim [mailto:[EMAIL PROTECTED] Sent: Wednesday, April 27, 2005 3:30 AM To: [email protected] Subject: Re: [castor-user] Transaction locks and muti threaded access Hi Vijay, I know that Gregory Block (another castor commiter) is using castor in a high-volume application. Even if I would call my appliaction a low-volume one, I also had to resolve some locking problems that I could track down to negligences at backgroud threads of my application. There are also some performance bottlenecks we are aware of and are working to solve them at our next refactoring steps at castor. For some of them we have working patches or workarounds available (will come to them later). I'll start with some general suggestions that you should have a look at. Please don't feel upset if some are really primitive but there may be users listening that are not aware of them. 1. Switch to version 0.9.6 of castor as we have fixed some bugs that may cause some of your problems. 2. Initialize your JDO or JDO2 (will be renamed to JDOManager at next release) instance once and reuse it all over your application. Don't reuse the Database instances. 3. Use a Datasource instead of a Driver configuration as they enable connection pooling which gives you a great performance improvement. 4. Always commit or rollback your transactions and close your Database instances properly also in fail situations as suggested by Nick previously. 5. Keep your transactions as short as possible. If you have an open transaction that holds a write lock on an object no other transaction can get a write lock on the same object which will lead to a LockNotGrantedException. 6. Query or load your objects read only whenever possible. Even if castor creates a lock on them this does not prevent other threads from reading or writing them. Read only queries are also about 7 times faster compared with default shared mode. 7. If there is a possibility you should prefer db.load(Class, object) over db.execute(String). I suggest that as db.load() first tries to load the requested object from cache and only retrieves it from database when it is not availble there. When executing queries with db.execute() the object will always be loaded from database without looking at the cache. You may gain a improvement by a factor of 10 and more when changing from db.execute() to db.load(). I hope above suggestions help you to resolve the problems you have. If you still need more performance there are 2 areas of improvement that are more difficult to resolve. a. If you have a look at http://jira.codehaus.org/browse/CASTOR-1085 where a patch to TransactionContext is attached that improves read/write performance with a factor of 3. Even if the patch passes all tests of castor test framework it requires more testing before we will integrate it in our next major release. As stated in the comment Gregory will use the patch in his production environment sooon. b. I will attache a test that shows how read only performance can be improved to http://jira.codehaus.org/browse/CASTOR-732 this evening. Hope I could help you with that information. Regards Ralf Vijayanand Sukumar schrieb: > All, > > Nick, Thanks for your explanation. We are using 0.9.5.3 . > > I will do a rollback on all the transactions when a > PersistenceException is > thrown. > > I am really interested to know if anyone is using castor in a high > volume , > mission critical application and the problems they faced if any and > how solved it. > > Thanks > > Vijay > > > > -----Original Message----- > From: Nick Stuart [mailto:[EMAIL PROTECTED] > Sent: Tuesday, April 26, 2005 4:32 PM > To: [email protected] > Subject: Re: [castor-user] Transaction locks and muti threaded access > > Will try my best to explain some of these issues in line. > > On 4/26/05, Vijayanand Sukumar <[EMAIL PROTECTED]> wrote: > >> >>We have been using castor-struts for about 2 years now and we are >>having some issues related to the castor. we are at a stage where due >>to performance issues we are thinking of moving away from castor. >> >>Any explanations/solutions for the given problems will be greatly >>appreciated. >> >>1. When more than 1 thread access the same object, is multiple copies >>of the same object is created or is the same instance of the object is >>used across multiple >> transactions. >> If it the same object then wouldn't it affect performance as in >>our case we have about a hundred users using the same record. > > > Yes its the same object. But no you shouldn't see a performance hit because > its serving it out of the Cache. In fact, if the object is used > enough, and > is always in the cache you would see a performance gain. This assumes > most of your actions are read only, as several threads acting on the > same object > and trying to do changes will cause problems. > > >> >>2. when a transaction fails , the locks on all the objects related to >>that transaction are not released. >> we have had instances where a >> LockNotGrantedException: WriteTimeOut >> occurs on a JDO object and the lock on the object is not released >>until the server is re-started. >> How can I release a lock on that object ? >> >> This problem kills all the mission critical applications where the >>application cannot be restarted. Can this be overcome if an explicit >>rollback is called ? > > > If you have a PersistenceExcpetion during a transaction (between > db.begin and db.commit) you should always do a rollback. This will > release the objects and locks. If you dont do this my best guess as to > what could happen > to your data is as good as yours. > > > >>3. when a commit fails and rollback is not explicitly called are all >>locks on the objects in that transaction released ? > > > They should be yes. If they are not my guess is that its a bug. You > never mentioned what version of castor you are using. > > >> >>4. A lock is obtained on an object even if it stated in the mapping as >>read-only. This slows down all the queries even if they are read-only >>, how can I overcome this ? >> > > > Not sure about this one myself....never ran into any problems with it. > > >>Based on my experience so far, I have a feeling that castor is not >>suited for high-volume, mission critical applications. >> > > > All my apps are well used, but not considered high volume so my > experince in > that area is limited. Although I'm pretty sure other people on the > list will > share their experinces about this. > > >>Has anyone used castor in a high-volume, mission critical application >>and have success story? >> >> >>ANY HELP WOULD BE GREATLY APPRECIATED. >> >>Thanks >> >>Vijay >> > > > Hope this helps some. Anyone else want to throw something this way? > -Nick -- Syscon Ingenieurb�ro f�r Me�- und Datentechnik GmbH Ralf Joachim Raiffeisenstra�e 11 D-72127 Kusterdingen Germany Tel. +49 7071 3690 52 Mobil: +49 173 9630135 Fax +49 7071 3690 98 Email: [EMAIL PROTECTED] Web: www.syscon-world.de

