/** * Copyright (C) 2008, 1C */ package ru.akimov.gfleak.web; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import javax.transaction.UserTransaction; /** * Servlet using a {@link DataSource} resource causes a problem in * J2EETransactionManager it remains in BaseCache as a key even after * the application is undeployed. * * @author Akimov */ public class LeakServlet extends HttpServlet { /* (non-Javadoc) * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { UserTransaction userTransaction = lookupUserTransaction(); DataSource dataSource = lookupDataSource(); userTransaction.begin(); try { Connection connection = lookupDataSource().getConnection(); try { connection.getMetaData(); } finally { connection.close(); } userTransaction.commit(); } catch (SQLException e) { userTransaction.rollback(); throw new ServletException(e); } } catch (ServletException e) { throw e; } catch (Exception e) { throw new ServletException(e); } PrintWriter writer = response.getWriter(); try { writer.print("Request has been completed. Undeploy application, " + "undeploy application and see LeakServlet in the heap dump."); writer.flush(); } finally { writer.close(); } } private DataSource lookupDataSource() throws NamingException { DataSource dataSource = null; InitialContext initialContext = new InitialContext(); try { dataSource = (DataSource)initialContext.lookup("java:comp/env/jdbc/DataSource"); } finally { initialContext.close(); } return dataSource; } private UserTransaction lookupUserTransaction() throws NamingException { UserTransaction userTransaction = null; InitialContext initialContext = new InitialContext(); try { userTransaction = (UserTransaction)initialContext.lookup("java:comp/UserTransaction"); } finally { initialContext.close(); } return userTransaction; } }