ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Kalcevich" <DKalcev...@marketlinx.com>
Subject RE: What is RequestScope used for?
Date Thu, 08 Mar 2007 17:38:53 GMT
OK, I think I found it.  There was an incorrect statement in our service class that was causing
the SQL Maps and DAO frameworks to be registered again.  I have since changed this logic and
am in the process of trying it out.  But thank you for the advice Clinton, it helped me find
the problem.
 
Daniel

________________________________

From: Clinton Begin [mailto:clinton.begin@gmail.com]
Sent: Thu 3/8/2007 9:06 AM
To: user-java@ibatis.apache.org
Subject: Re: What is RequestScope used for?


There should be ONE instance of SQLMapClientImpl.  And there's only ONE thing that creates
it....a call to SqlMapClientBuilder.buildSqlMapClient();

Now the DAO framework builds that instance for you, but the DAOManagerBuilder works the same
way...you get only one instance per call to buildDaoManager()  (or whatever the method is
called). 

I'm betting you have some service class or something that's madly instantiating or initializing
DaoManagers or SqlMapClients .... or perhaps Spring containers....something is messed up wherever
you configure your classes. 

Clinton


On 3/8/07, Daniel Kalcevich <DKalcevich@marketlinx.com> wrote: 

	Clinton,
	
	What do you mean?  What would cause that type of condition in the SQL Maps?
	
	Daniel
	
	________________________________
	
	From: Clinton Begin [mailto: clinton.begin@gmail.com <mailto:clinton.begin@gmail.com>
]
	Sent: Thu 3/8/2007 8:50 AM
	To: user-java@ibatis.apache.org
	Subject: Re: What is RequestScope used for?
	
	
	>>  The snapshot I took showed 402 objects of the SqlMapClientImpl a 
	
	It's now clear to me that you're building more than one SQL Map instance...possibly one per
thread.
	
	It's not your transactional code, it's wherever you're building your DAOManager or your SqlMapClient.

	
	Clinton
	
	
	On 3/8/07, Daniel Kalcevich <DKalcevich@marketlinx.com> wrote:
	
	        OK, I went ahead and changed the places where DaoManager is used and made the logic
something like the following: 
	
	        try {
	             DAOManager.startTransaction();
	
	             ...something...
	
	            DAOManager.commitTransaction ();
	        } finally {
	           DAOManager.endTransaction(); 
	        }
	
	        After making those changes, I am still seeing those RequestScope objects in Memory.
 The snapshot I took showed 402 objects of the SqlMapClientImpl and 205, 824 objects of the
Request Scope.
	
	        Is there any place else I should look to help with these RequestScope Objects?
	
	        Daniel
	
	        ________________________________
	
	        From: Kalcevich, Daniel [mailto: dkalcevich@firstam.com <mailto:dkalcevich@firstam.com>
 ]
	        Sent: Tue 3/6/2007 10:11 AM
	        To: user-java@ibatis.apache.org
	        Subject: RE: What is RequestScope used for?
	
	
	
	        Clinton,
	
	
	
	        Thanks for the help.  I will change the DaoManager to handle the transactions at
the points in the code where I am using them.  That way, should I perform any calls that require
transactions, they will already be there.  I'll try it out and let you know if I run into
any more problems. 
	
	
	
	        Daniel
	
	
	
	        ________________________________
	
	        >> With regards to the DAO framework side of it, could I just wrap any calls
to the SQL maps
	        >> with a try/finally that always calls the endTransaction() method on the
SqlMapClient? 
	
	        No, don't do that.  The iBATIS DAO framework is very similar to Spring.  It handles
the transactions inside the DAOs for you.  But the consumer of the DAOs shoudl be starting
and ending transactions on the DaoManager within a try/finally block. 
	
	        >> Because all of them are only SELECT statements, I don't really need transactions
inside the library itself.
	        >> Or do I actually need to insert the startTransaction() and commitTransaction()
methods regardless? 
	
	        No, you don't need start/commit/end if you're just doing selects.  You can just call
the DAO methods.  Just make sure you're not calling start without a corresponding end....
	
	        Clinton 
	
	        ________________________________
	
	        From: Kalcevich, Daniel
	        Sent: Tuesday, March 06, 2007 9:46 AM
	        To: 'user-java@ibatis.apache.org '
	        Subject: RE: What is RequestScope used for?
	
	
	
	        Clinton,
	
	
	
	        Yes, the applications run inside the same JVM.
	
	
	
	        As for the Spring, I have already posted something to the Spring forum verifying
that the way in which we use them are correct, and they appear to be. 
	
	
	
	        With regards to the DAO framework side of it, could I just wrap any calls to the
SQL maps with a try/finally that always calls the endTransaction() method on the SqlMapClient?
 Because all of them are only SELECT statements, I don't really need transactions inside the
library itself.  Or do I actually need to insert the startTransaction() and commitTransaction()
methods regardless? 
	
	
	
	        Daniel
	
	
	
	        ________________________________
	
	        Is this all in the same VM?
	
	        Spring is the recommended DAO solution and is probably the way that at least 50%
of iBATIS users use it.  You don't need to worry about transactions at all with Spring, it
will take care of it (as far as iBATIS is concerned at least).  Have a look at the spring
docs to ensure that you're using it the right way. 
	
	        I agree that you should start by looking at the other part that uses your own lib
with iBATIS DAO.  With iBATIS DAO you need to ensure you're starting and ending transactions
in a try/finally block just like with SqlMapClient. 
	
	        Cheers,
	        Clinton
	
	
	
	        ________________________________
	
	        From: Kalcevich, Daniel
	        Sent: Tuesday, March 06, 2007 9:29 AM
	        To: ' user-java@ibatis.apache.org <mailto:user-java@ibatis.apache.org>  '
	        Subject: RE: What is RequestScope used for?
	
	
	
	        Clinton,
	
	
	
	        Thanks for the response.  Now with regards to the Transactions... our application
uses SQL Maps in two different ways. 
	
	
	
	        1.      Within Spring inside the Web App - We use transactions within Spring, thus
SQL maps should not be using the transactions.
	        2.      A library we developed that the Web App uses - This uses the DAO framework
and SQL Maps internally, but only retrieves information from the DB, not inserts. 
	
	
	
	        For the Transactions, do I have to declare them explicitly in both places, or do
you think it would be better to address the standalone library first?
	
	
	
	        Daniel
	
	
	
	        ________________________________ 
	
	        Yep, you have a leak and it is RequestScope related...but it's likely not an ibatis
bug...
	
	        It's more likely that you're not ending transactions properly.
	
	        try {
	          sqlMapClient.startTransaction ();
	          ///... do work
	        } finally {
	          sqlMapClient.endTransaction();
	        }
	
	        Clinton
	
	
	
	        ________________________________ 
	
	        From: Kalcevich, Daniel
	        Sent: Tuesday, March 06, 2007 8:18 AM
	        To: ' user-java@ibatis.apache.org'
	        Subject: RE: What is RequestScope used for? 
	
	
	
	        OK, upon looking at the Yourkit, I am showing the number of objects in memory as
the following:
	
	
	
	        -          com.ibatis.sqlmap.engine.impl.SqlMapClientImpl - 212 objects with a total
retained size in memory of 31.38MB
	
	        -          com.ibatis.sqlmap.engine.scope.RequestScope - 108, 544 objects with a
total retained size in memory of 16.49MB.
	
	        -          com.ibatis.sqlmap.engine.scope.SessionScope - 27,136 objects with a total
retained size in memory of 3.03 MB.
	
	
	
	        Do those numbers make sense?  I only question it because with every snapshot of the
memory I have taken along the way, the RequestScope/SessionScope objects keep increasing.
	
	
	
	        Daniel
	
	
	
	        ________________________________
	
	        From: Kalcevich, Daniel
	        Sent: Tuesday, March 06, 2007 7:04 AM
	        To: ' user-java@ibatis.apache.org <mailto:user-java@ibatis.apache.org>  '
	        Subject: RE: What is RequestScope used for?
	
	
	
	        I found about this RequestScope through the profiler YourKit.  Here is the trail
that references the IBatis objects. 
	
	
	
	        map of com.ibatis.sqlmap.engine.scope.RequestScope
	
	        --[121] of java.lang.Object[513]
	
	        ---elementData of java.util.ArrayList
	
	        ----list of java.util.Collections$SynchronizedRandomAccessList 
	
	        -----pool of com.ibatis.common.util.ThrottledPool
	
	        ------requestPool of com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelega te
	
	        ------delegate of com.ibatis.sqlmap.engine.impl.SqlMapClientImpl 
	
	        -------client of com.ibatis.dao.engine.transaction.sqlmap.SqlMapDao TransactionManager
	
	        --------transactionManager of com.ibatis.dao.engine.impl.DaoContext
	
	        ---------[0] of java.lang.Object [11]
	
	        ----------elementData of java.util.ArrayList
	
	        -----------value of java.lang.ThreadLocal$ThreadLocalMap$Entry
	
	        ------------[1442] of java.lang.ThreadLocal$ThreadLocalMap$Entry [2049]
	
	        -------------table of java.lang.ThreadLocal$ThreadLocalMap
	
	        --------------threadLocals of java.lang.Thread [Stack Local, Thread]
	
	
	
	
	
	        The reason I thought it might be contributing to a memory leak was the fact that
at every snapshot I take, the number of HashMaps continues to increase without going down.
 Then when I look at what it is referring to, it points to the RequestScope. 
	
	
	
	        While looking in the trace, I saw that it was referencing the DaoContext's transaction
Manager.  Could the Transaction Manager be playing a part in this?  My application uses Spring
with SQL Maps, but a library we wrote uses the DAO Framework specifically.  The Spring application
does not use it.  I think that is worth looking into, given what I see in the profiler. 
	
	
	
	        Daniel
	
	
	
	
	
	        ________________________________
	
	        From: Kalcevich, Daniel
	        Sent: Monday, March 05, 2007 11:37 AM
	        To: ' user-java@ibatis.apache.org <mailto:user-java@ibatis.apache.org>  '
	        Subject: What is RequestScope used for?
	
	
	
	        Hello,
	
	
	
	        I have a Spring, Struts, SQL Map application that runs on JBoss/Tomcat.  And while
going through a profiler, I am seeing that there are several instances of " com.ibatis.sqlmap.engine.scope.RequestScope".
 What is that object used for?  The reason I ask is that I am trying to track down a memory
leak and am wondering if this class is possibly part of the cause?  Any help is greatly appreciated.
 Thank you. 
	
	
	
	        Daniel
	
	
	
	
	
	
	



Mime
View raw message