Ralf, 

Thanks for your advice. I will do the changes you suggested.

Regarding not re-using database instances...

This is what we do. Please correct me if this is not the right approach.

When the application starts, we instantiate a JDO object and keep it in the
context.

...
jdo = new JDO();
JDO.loadConfiguration(getClass().getClassLoader().getResource(DATABASE_FILE_
NAME).toString());
jdo.setDatabaseName(jdoDatabaseName);
jdo.setTransactionManager(txmgr);
initContext.bind(jdoJndiName, jdo);
...

And in our struts action class , inside the execute method we do 

Database db = jdo.getDatabase();
db.open();
xxDB.getObject(someparameters, db);

db.commit();

Where jdo is a instance object in the Action class and the value is set in
the init() method.
 
So each time the execute is called , a new database is obtained. Is this
approach right ?


Since the transaction is opened and committed in the execute method, the
number of SQL statements executed in that transaction are fairly more. 
Is this what you meant by 

>> 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.

Thanks again for all your help.

Vijay


-----Original Message-----
From: Ralf Joachim [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, April 27, 2005 6:13 AM
To: [email protected]
Subject: Re: [castor-user] Transaction locks and muti threaded access

Hi Mike,

for queries:

String oql = "select o from FooBar o";
Query query = db.getOQLQuery(oql);
QueryResults results = query.execute(Database.ReadOnly);

to load an object by its identity:

Integer id = new Integer(7);
Foo foo = (Foo) db.load(Foo.class, id, Database.ReadOnly);

Ralf


Mike Wannamaker schrieb:
> Ralf,  How do I do this?  Make a query read only that is?
> 
> 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.
> 
> --ekiM
> 
> Ralf Joachim wrote:
> 
>> 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

Reply via email to