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

Reply via email to