Wow, I didn't realize that I am creating a new instance of the SqlMapClient every time I call this method. That obviously is not a good thing. Thank you for discovering my oversight and for your suggested fixes. I will scratch my head for a bit and figure out how to fix this situation. Thanks again!
Jeff Butler-2 wrote: > > IIRC, Struts2 actions are not singletons. So this code is creating a > new instance of the SqlMapClient (and it's associated connection pool) > each time you hit the web page. They will eventually get cleaned up > by the GC, but that might take a while. > > Better would be to implement ApplicationAware also, then write code like > this: > > SqlMapClient sqlMap = (SqlMapClient) applicationMap.get("sqlMap"); > if (sqlMap == null) { > try { > sqlMap = > SqlMapClientBuilder.buildSqlMapClient(Resources.getResourceAsReader("sqlMaps.xml")); > applicationMap.put("sqlMap", sqlMap); > } catch (Exception e) { > e.printStackTrace(); > } > } > > Make sure all other actions use this same code - a good use for a > super class :). Then you know it's only created once. > > Jeff Butler > > > > > On Mon, Oct 19, 2009 at 3:28 PM, Jim Borland <jborl...@calpoly.edu> wrote: >> >> Here it is. Thanks for your interest in my situation. Using Apache >> Struts2 >> - this is an action implementation. The call is to "listOfArtists" in >> class >> "ListSwingCatAction" >> >> ============================= >> >> public class ListSwingCatAction implements SessionAware >> { >> private SqlMapClient sqlMap; >> private SwingCatIBatisDBHandler myDBHandler; >> private Map sessionMap; >> >> public ListSwingCatAction() >> { >> try >> { >> sqlMap = >> SqlMapClientBuilder.buildSqlMapClient(Resources.getResourceAsReader("sqlMaps.xml")); >> } >> catch (Exception e) >> { >> e.printStackTrace(); >> } >> myDBHandler = new SwingCatIBatisDBHandler(sqlMap); >> } >> >> public String listOfArtists() >> { >> ArrayList artists = myDBHandler.getArtistInfo(); >> sessionMap.put("artists", artists); >> return "success"; >> } >> } >> >> ============================= >> >> >> Jeff Butler-2 wrote: >>> >>> We should also see the Java code that creates the SqlMapClient. >>> Without Spring you need to make sure that only a SINGLE instance of >>> that object is created (it should be and stored either in a singleton >>> or something like a web context). >>> >>> Jeff Butler >>> >>> On Mon, Oct 19, 2009 at 2:50 PM, Larry Meadors <larry.mead...@gmail.com> >>> wrote: >>>> Can you post the sqlmapconfig.xml? >>>> >>>> On Mon, Oct 19, 2009 at 1:44 PM, Jim Borland <jborl...@calpoly.edu> >>>> wrote: >>>>> >>>>> No, I'm not smart enough to use a DAO implementation (I've read a >>>>> little >>>>> about them). Also, I keep reading about Spring -- a whole bunch of >>>>> stuff on >>>>> it comes up when I Google on these topics. Someday I'm going to check >>>>> into >>>>> Spring. >>>>> >>>>> My situation is very simple and it seems like plain old iBatis ought >>>>> to >>>>> be >>>>> plenty for me in this application. iBatis is supposed to take care of >>>>> all >>>>> the background stuff and just let me write mapped statements. I'm >>>>> committed >>>>> to making iBatis work without a bunch of extra stuff. Thanks for your >>>>> interest in my problem. >>>>> >>>>> >>>>> Warren Bell-2 wrote: >>>>>> >>>>>> Are you using any DAO implementation ? Spring? Makes things much >>>>>> simpler. >>>>>> >>>>>> Warren >>>>>> >>>>>> Jim Borland wrote: >>>>>>> I've been fighting this issue for a long time now and am quite >>>>>>> frustrated. I >>>>>>> originally started out with just: >>>>>>> >>>>>>> --> artists = (ArrayList) sqlMap.queryForList("getArtistInfo", list >>>>>>> ); >>>>>>> -- >>>>>>> but was getting all these <IDLE> connections. So I tried adding >>>>>>> start/commit/end transaction statements surrounding the query. >>>>>>> Still >>>>>>> getting <IDLE>s so then I tried using : >>>>>>> >>>>>>> --> session = sqlMap.openSession(); -- and letting the session >>>>>>> start/commit/end the transaction. Still got <IDLE>s. That's when I >>>>>>> tried >>>>>>> creating, using and closing my own connection with the same sad >>>>>>> result. >>>>>>> >>>>>>> One thing Rick Wellman said was especially interesting. Every time >>>>>>> you >>>>>>> create an instance of SqlMapClient you create an entirely new >>>>>>> connection >>>>>>> pool. I hadn't thought about that before. I guess the bottom line >>>>>>> is >>>>>>> I >>>>>>> don't really understand what is happening in a connection pool. >>>>>>> Still, >>>>>>> my >>>>>>> situation is so simple, yet the same bad outcome occurs no matter >>>>>>> what >>>>>>> I >>>>>>> try. Help! >>>>>>> >>>>>>> >>>>>>> Rick.Wellman wrote: >>>>>>> >>>>>>>> Since I have some time over lunch: >>>>>>>> 1) I agree with Larry's reply below >>>>>>>> 2) At the risk of embarrassing myself on this forum, see below for >>>>>>>> my >>>>>>>> reply to your comments and questions: >>>>>>>> >>>>>>>> [your-code-sample-was-here] >>>>>>>> [your-comments-were-here] >>>>>>>> I've been wrestling with this problem for a long time and right now >>>>>>>> there are three things about which I wonder: >>>>>>>> >>>>>>>> (1) All the code examples I've seen show the sqlMapClient being >>>>>>>> generated in the same try statement as the actual query. I'm >>>>>>>> creating >>>>>>>> it >>>>>>>> in a separate class and passing it to another class. Could this be >>>>>>>> a >>>>>>>> problem? I'm not sure why it would matter, but that is something >>>>>>>> unique >>>>>>>> about my situation. >>>>>>>> >>>>>>>>>> Usually, your entire application would share a single instance of >>>>>>>>>> >>>>>>>> SqlMapClient. It matters in the sense that it is un-necessary and >>>>>>>> would, at a minimum, create an entirely new connection pool (see #3 >>>>>>>> for >>>>>>>> more) >>>>>>>> >>>>>>>> (2) In the above code I use the DataSource obtained from >>>>>>>> SqlMapClient >>>>>>>> -- >>>>>>>> Is there something wrong with doing this? >>>>>>>> >>>>>>>>>> Well, probably... and it is un-necessary. Use Larry's version. >>>>>>>>>> (i.e. >>>>>>>>>> >>>>>>>> the "normal" way to use the SqlMapClient) >>>>>>>> >>>>>>>> (3) Have I somehow mis-configured the connection pool? >>>>>>>> >>>>>>>>>> I could be wrong but I still highly suspect that the connections >>>>>>>>>> are >>>>>>>>>> >>>>>>>> a result of the connection pool and it seems to me that you're not >>>>>>>> understanding the purpose of a connection pool. i.e. You're trying >>>>>>>> to >>>>>>>> explicitly open a connection with code. The connection pool will >>>>>>>> usually expand and contract the number of connections to the >>>>>>>> database >>>>>>>> based on the load and its configuration (which is why it is called >>>>>>>> a >>>>>>>> "pool"). You do not have "direct" control over which connection >>>>>>>> your >>>>>>>> iBatis SqlMapClient will use [nor do you probably want that]. I >>>>>>>> apologize in advance if I am way off base with this response; not >>>>>>>> my >>>>>>>> intent to offend, but rather educate. >>>>>>>> >>>>>>>> To the masses... in regards to my comment #3, is there an >>>>>>>> implementation >>>>>>>> of a "pool" which is not a pool at all but a single connection that >>>>>>>> someone can use to verify an instance like this? Or maybe >>>>>>>> configure >>>>>>>> the >>>>>>>> "pool" to only have a size of one? Just thinking out loud... I've >>>>>>>> never >>>>>>>> had reason to look into something like this but it seems like this >>>>>>>> question comes up every so often? (i.e. the question of connections >>>>>>>> opened via iBatis) >>>>>>>> >>>>>>>> -----Original Message----- >>>>>>>> From: Larry Meadors [mailto:larry.mead...@gmail.com] >>>>>>>> Sent: Monday, October 19, 2009 12:56 PM >>>>>>>> To: user-java@ibatis.apache.org >>>>>>>> Subject: Re: iBatis - Connections to PostgreSQL Not Closing >>>>>>>> >>>>>>>> This looks to me like you are *way* overcomplicating this. :-) >>>>>>>> >>>>>>>> The method should be more like this: >>>>>>>> >>>>>>>> public List getArtistInfo(){ >>>>>>>> return sqlMap.queryForList("getArtistInfo", list); >>>>>>>> } >>>>>>>> >>>>>>>> Unless you have some really crazy wacky stuff going on, there >>>>>>>> should >>>>>>>> never be a need for you to deal with connections at that level. >>>>>>>> >>>>>>>> Also, what's the purpose of passing in 'list' as the second >>>>>>>> parameter >>>>>>>> there? I don't see where it would ever be non-null. >>>>>>>> >>>>>>>> Larry >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>>>>>>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>>>>>>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Thanks, >>>>>> >>>>>> Warren Bell >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>>>>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> View this message in context: >>>>> http://www.nabble.com/iBatis---Connections-to-PostgreSQL-Not-Closing-tp25943619p25964382.html >>>>> Sent from the iBATIS - User - Java mailing list archive at Nabble.com. >>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>>>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>>>> >>>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>>> >>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >>> For additional commands, e-mail: user-java-h...@ibatis.apache.org >>> >>> >>> >> >> -- >> View this message in context: >> http://www.nabble.com/iBatis---Connections-to-PostgreSQL-Not-Closing-tp25943619p25965093.html >> Sent from the iBATIS - User - Java mailing list archive at Nabble.com. >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >> For additional commands, e-mail: user-java-h...@ibatis.apache.org >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org > For additional commands, e-mail: user-java-h...@ibatis.apache.org > > > -- View this message in context: http://www.nabble.com/iBatis---Connections-to-PostgreSQL-Not-Closing-tp25943619p25965920.html Sent from the iBATIS - User - Java mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org For additional commands, e-mail: user-java-h...@ibatis.apache.org