BACKGROUND: I've been doing Java servlet coding for about 2 years and need help understanding something. I work on a legacy JSP and servlets web application project using Tomcat. Previously all the SQL was embedded right into the Java and JSP code. I added the myBatis framework and moved all the SQL to mappers. Also previously, every SQL statement had its own separate DB connection instantiated and opened but not closed. I changed that so each servlet request would have only one open DB connection by adding a ServletRequestListener that opens the sqlSession in requestInitialized and closes it in requestDestroyed.
PROBLEM: When running in my IDE in my dev environment, various random myBatis calls in the JSP pages would fail. After one would fail, all the rest would fail too. There were 3 repeated phrases - NullPointerException, PersistenceException, and ExecutorException Executor was closed. DEBUGGING: It appeared the DB connection was being closed before the page was finished rendering. That meant the MyBatis ServletRequestListener requestDestroyed handler was being triggered before the JSP page was finished being served. When I commented out the sqlSession.close statement the JSP page worked OK. WORK-AROUND: I added a keepConnectionOpen flag in my development configuration file and coded the ServletRequestListener requestDestroyed handler to not close the sqlSession if the flag was true. The JSP page now loads without error. NOTE 1: While there being only one open SQL session per servlet request open at a time is an improvement, it bothers me that the DB connection is not being explicitly closed. NOTE 2: The problem does not currently happen in our test environment. NOTE 3: Our web site has low traffic volume. QUESTION(s) 1: Why is the ServletRequestListener requestDestroyed handler triggered before the JSP page is finished? Is it due to my IDE or Tomcat or something else? My interpretation is that the IDE is handling the processing differently than Tomcat somehow, although I don't understand that since the IDE is invoking Tomcat. Should I be concerned that the problem will eventually happen in my test and future production environments? QUESTION 2: Is there a better way to manage DB connections anyway? DEVELOPMENT ENVIRONMENT: OS - Windows 7 Pro SP1 64-Bit IDE - IntelliJ Idea 12.1.6 TOMCAT - 6.0.37 JAVA - JDK 1.6.0.24 TEST ENVIRONMENT: OS - Windows Server 2012 R2 Standard 64-Bit TOMCAT - 6.0.37 JAVA - JRE 1.8.0.45 NOTE 4: My customer uses Tomcat 6, so I must use that too. You read down this far? Thanks for your time, help, and encouragement. :-) -- Cris Berneburg, Lead Software Engineer, CACI --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org