On Sat, Aug 16, 2025, 15:44 Chuck Caldarale <n82...@gmail.com> wrote:
> Robert - > > (Sorry for top-posting, but this is just about GlassFish 4.1, not Dan’s > problem.) > > GlassFish 4.1 is a bit hard to find these days, but it can be downloaded > from here: https://javaee.github.io/glassfish/download > > Also, 4.1 refuses to run on a modern JVM, resulting in this message: > > GlassFish requires Java SE version 6. Your JDK is version 0 > > Mine is currently 23.0.2; not sure how far back one will have to go… > > - Chuck > Thanks for the heads up. That might be a bit tricky then... Maybe that won't happen then. > > > > On 2025 Aug 16, at 14:02, Robert Turner <rtur...@e-djuster.ca.INVALID> > wrote: > > > > Dan, > > > > You are doing well to keep up -- we keep throwing lots at you. I think we > > all find this issue so bizarre we really want to figure it out. We are, > > even if it doesn't look like it, slowly eliminating some potential > causes. > > > > I've put a few comments inline, and then a larger update on some testing > I > > was doing this morning to try to reproduce what you are observing in your > > live system. > > > > Questions / suggestions for Dan marked with @Dan > > > > On Sat, Aug 16, 2025 at 2:31 PM Chuck Caldarale <n82...@gmail.com > <mailto:n82...@gmail.com>> wrote: > > > >> > >>> On 2025 Aug 16, at 12:44, Daniel Schwartz <d...@danielgschwartz.com> > >> wrote: > >>> > >>> From: Chuck Caldarale <n82...@gmail.com> > >>> Sent: Saturday, August 16, 2025 1:33 PM > >>> To: Tomcat Users List <users@tomcat.apache.org> > >>> Subject: Re: [EXTERNAL EMAIL] How to access a REST service > >>> > >>>> Immediately after doing this, the message copied below started > >> appearing repeatedly in the server.log and my website stopped > working---the > >> DB evidently became inaccessible. However, Glassfish was still running, > >> and as soon as I set the maximum pool size back to 1000, these messages > >> stopped coming and the website started working again. > >>> > >>> Indicative of an orphaned connection (resource leak). > >>> > >>> DGS: Why is this? What do those messages have to do with a resource > >> leak? > >> > >> > >> When the pool is at its maximum and all connections are in use, > GlassFish > >> will hold requests for a configurable amount of time (max-wait, > defaults to > >> 60 seconds), and only abort the request and log the situation after the > >> caller has been suspended for that amount of time. Since your web > service’s > >> response time is very quick, this indicates the only allocated > connection > >> has stayed in-use for over a minute - something leaked it. > >> > >> When the maximum pool size is set to your usual value, GlassFish > >> eventually cleans things up because it periodically discards all > existing > >> connections and acquires new ones just in case they have become unusable > >> from the DB point of view. > >> > > > > Just to add that there is another situation, but is unlikely based on the > > default HTTP thread count maximums. It could be that you are getting a > > large amount of connections faster than they can be processed -- i.e. > let's > > say 100 per 10 ms would overflow the connection pool if you had a limit > of > > 50 and your average response time was 10 ms. This was why I asked about > > your settings for HTTP thread limits. > > > > I will check Glassfish 4.1 a bit later today, but with Glassfish 7.0.25 > > ("out of the box") the limit on the HTTP processing threads was 5, and > > without increasing that, it's not possible to have more than 5 typical > > requests being processed at once. That means that if each request never > > acquires more than 1 connection (which is the case in all the examples > you > > have provided), the connection pool usage should never grow beyond 5. > > > > So, unless you have increased the HTTP processing thread limits from > > defaults to a value larger than the default thread pool maximum size, or > > the deployment you are using does such, you shouldn't have seen an issue > > originally if all the connections are being released to the pool. The > "peak > > value", as tracked in Glassfish, should never exceed this thread count > > unless a connection is not being returned to the pool. > > > > Thus, the conclusion that there is a leak somewhere, but where... I'm not > > sure at this point. > > This is where I think we need to focus on -- possibly by dialing back > your > > settings, and also by looking at what's going on with the robot requests > -- > > are they causing faults that aren't visible"? > > (more on this at the end) > > > > @Dan: It would be a really good idea though (as it's been said, and been > > acknowledged) to wrap all the connection / statement / result-set > > acquisitions with try-with-resources. Not only will it rule out leaks > from > > those going forward, it will also simplify your code and make it easier > to > > read. I would do this sooner so we can try to rule out leaks from those > > activities. > > > > > > > >> > >>> So this is very interesting, and points to a possible line of > >> investigation. If the web crawlers are throwing garbage at your app, > that > >> could possibly be resulting in losing track of connections, statements, > >> result sets, etc. You should carefully check your error paths and make > sure > >> that all DB-related resources are being properly disposed of when > invalid > >> input is received. > >>> > >>> DGS: I'm fairly sure that all connections and prepared statements are > >> being closed, but will look again. This would be happening in the code > >> fragment that tries to retrieve the list of holidays with calculated > dates > >> (not the countries). This is somewhat complex and could have problems. > >> > >> > >> Your GetCountryList code from a previous message doesn’t dispose of the > >> ResultSet object; depending on the implementation details of the JDBC > >> driver and pool, closing the result set may not be required, but it’s > >> always good practice to do so. Since the ResultSet object contains a > >> reference to the Connection (and vice-versa), it may be interfering with > >> reuse of the connection until a garbage collection happens. > >> > > > > > > Okay, so while I was in between things this morning I did a whole bunch > of > > testing. > > > > With Glassfish 7.0.25, with JDK 21, and the latest PostgreSQL JDBC > driver, > > I was unable to reproduce the "leak" problem using code very similar to > > Dan's. > > > > I tried all of the following: > > - enabling and disabling the JDBC object wrapping in Glassfish > > - using the "singleton" data source or retrieving one each request > > - not closing the Statement or the ResultSet / or closing them > > - not closing the Connection or closing it > > > > The only situation where I could reproduce a leak (and very quickly) was > to > > fail to close the connection. (remove it from the try-with-resources > > block). I could not get the lack of closing the ResultSet or the > Statement > > to trigger a "leak" in the connection pool -- but that doesn't mean one > can > > ignore that, only that it didn't definitely cause the issue in my test > > setup. > > > > I was not however running any "real queries". I was just running "SELECT > 1" > > each time and returning the integer to the caller. So no data was coming > > from the client that could be triggering other potential failures. > > > > My next plan is to switch to MySQL JDBC (as I noted this is what Dan is > > using) and see if maybe there is something different with that JDBC > driver > > and do the same tests. > > > > @Dan: Could you share the exact version of the JDBC driver you are using? > > > > And then, I'll try rolling back to Glassfish 4.1.x and see if that makes > a > > difference. > > > > @Dan: Is there a minor version, or is it 4.1.latest ? > > > > > > Dan: it would also be a good idea to "verify" the parameters coming in > for > > "valid values" without using a DB query (if that is possible) so as to > > avoid the robots triggering DB connections. Ultimately this is a risk of > a > > DoS type of attack. You can also employ rate limiting as well to help > avoid > > such problems. > > > > @Dan: I think we also need to change your "printing to Stdout" to print > to > > the Glassfish logger. The problem with printing to Stdout is that only > the > > HTTP client making the request that triggers these logs will see them. > This > > could be "masking" some errors where you aren't doing the testing > yourself. > > (I could be wrong about where Stdout output goes though -- so if you do > see > > those in the logs, then ignore this item. I will validate that shortly > > myself in Glassfish 7.0.25). > > > > @Dan: Have you been able to get a rough count of the request rate you are > > seeing on your server, so we have some idea if it's even possible to be > > seeing an overload situation or if we can rule that out. > > > > > > Robert > > (who is clearly spending way too much time on Dan's issue, but is very > > puzzled and wants to get to the bottom of it, and as a result has now > used > > Glassfish for the first time... :) ) > >