Hello Chris, Thanks. This looks helpful.
Dan Schwartz -----Original Message----- From: Christopher Schultz <ch...@christopherschultz.net> Sent: Monday, August 4, 2025 10:15 AM To: users@tomcat.apache.org Subject: Re: How to access a REST service Daniel, Apologies for top-posting, but I would highly recommend reading this: https://urldefense.proofpoint.com/v2/url?u=https-3A__blog.christopherschultz.net_2009_03_16_properly-2Dhandling-2Dpooled-2Djdbc-2Dconnections_&d=DwIDaQ&c=euGZstcaTDllvimEN8b7jXrwqOf-v5A_CdpgnVfiiMM&r=AbCalLxzopgQUG9LLcXdB80OM-GtDfItX76RMxNYqz4&m=064mdQS9YsKOGXjo7gBDQ2Mi-puZWT6oWPOKTs_HzFX46_g9-I_RzQ4NZsP5yFkU&s=asZCa1h2Ah3YYzVVNf_SaATQFdLYcoF_wkrSSt6a-Nw&e= -chris On 8/1/25 3:33 PM, Daniel Schwartz wrote: > Hello Thorsten, > > Please see my replies below, marked DGS. > > -----Original Message----- > From: Thorsten Heit <heit_tom...@icloud.com.INVALID> > Sent: Friday, August 1, 2025 5:32 AM > To: users@tomcat.apache.org > Subject: Re: How to access a REST service > > Hi, > >> Daniel, >> You might take a look at java’s “ try with” construct > > DGS: Someone else recommended this. I will look into it. I see that an > issue with my current code is that the database connection won't be closed if > an error is thrown. > > This is an important step, indeed: > >>> Here is a fragment of the code from the file HolidaysRESTJSONResource.jar. >>> -------------------------------------------------------------------- >>> - >>> ----- public class HolidaysRESTJSONResource { >>> >>> DataSource dataSource; >>> >>> public HolidaysRESTJSONResource() { >>> dataSource = DataSourceSingleton.getInstance().dataSource; >>> } >>> >>> @GET >>> @Path("/countries") >>> @Produces(MediaType.APPLICATION_JSON) >>> public String getJsonCountries() { >>> ... >>> Connection connection; >>> try { >>> connection = dataSource.getConnection(); >>> TempDataStorage.countryList = >>> GetCountryList.doIt(connection); >>> connection.close(); >>> ... >>> } > > A couple of questions: > > 1) How often is your class instantiated/created? Is it a singleton? A new one > per each incoming request? > > DGS: It is created with every database query. For each user query there can > be 1-3 database queries, and the same user can make an unlimited number of > queries. I know it would be better if I could somehow identify a "user > session" and only create one connection per session, but I don't know how to > do this. > > 2) What happens in case of an exception in your try block? Looking at > the above snipped the connection isn't closed. > > DGS: Yes, that's an issue, which I have noted in the foregoing. I'll change > to the "try-with" approach. > >>> The constructor for HolidaysRESTJSONResource creates a DataSource by >>> creating an instance of the following DataSourceSingleton class and >>> retrieving the value of the DataSource instance variable. I >>> borrowed this code from somewhere. It seems to work. The MySql >>> database is called "holidays". > > 3) Have a look at the version of the database driver you're using. Is > there perhaps a newer one? If yes, have a look at the release notes > and check the changes. Perhaps there's a leak in the driver itself...? > > DGS: I'm using the latest MySQL 8 driver. > >>> Back in HolidaysRESTJSONResource, in the method getJsonCountries(), >>> the DataSource object, called "dataSource", is used to create the >>> connection object, and this is used in a method call >>> GetCountryList.doIt() to retrieve a list of countries from the >>> database. Then this connection object is closed. I think that this >>> is all that is needed to prevent memory leaks. Is this correct? I >>> do this for every such method call that accesses the database. > > AFAICT only in case of proper execution wrt to the code snippet > presented. In case of an exception during the #doIt(...) call this > won't happen (correctly) and can result in a memory leak (AFAIK). > > DGS: Good point. The doIt() method can throw an exception. I will look into > this. > > What happens in case of multiple simultaneously incoming requests? > Does your database (and driver) allow enough parallel connections so > that each request is processed correctly? > > DGS: I have the Glassfish database connections maximum pool size set to 1000. > This seems to be enough. When I submitted this question, the system was > crashing occasionally, but then I noticed that the pool size had > inadvertently been reset to the default 32. This must have happened when I > reinstalled Glassfish and then neglected to update pool size. It seems to be > working now. No crashes in the last day. > > DGS: Thanks for taking the time to respond. Do you know of a way to > identify the start and end of a user session? > > Regards > > Thorsten > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org