You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Kai Müller <km...@mediadom.de> on 2000/11/28 11:32:21 UTC

HELP: Memory Leak , requests are not worked off

Hello everybody,

I have an urgent and difficult problem.

My JSP reads data via JDBC from MySQL, more exactly: via an
Accessor.class and a Database.class (both are unique in the
application). I have one common persistent connection. The resultSet and
statements are closed properly after each select. The results I write
into new objects and fill a TreeMap of them which is in session scope
(see also the code fragments).

---------- The problem --------------

If I make 10.000 requests to the JSP (which reads everytime the TreeMap)
directly one after another, the memory of the application grows, slowly,
but permanently.

This causes in the HTML-Output the following error:

[...]
java.lang.IllegalStateException: Response has already been committed
        at
org.apache.tomcat.core.HttpServletResponseFacade.sendError(HttpServletResponseFacade.java,

Compiled Code)
        at
org.apache.jasper.runtime.JspServlet.unknownException(JspServlet.java,
Compiled Code)
[...]

In the Console-Output an OutOfMemoryError occurs. The 10.000 requests
are not worked off to the end.

---------- The questions --------------

1. How does Tomcat handle quickly following requests?
2. Can you see if a request has been stopped (by pressing on reload or
stop)?
3. Can you stop executing a started java process?
4. Is "Thread pooling" a solution? How does it work?
5. Why doesn't work the garbage collection in my case?
6. Can anybody help me???

Thank you very much.

Kai Müller

---------- Code fragments -----------

---------- JSP fragment -------------
...
<%-- initialize myTreeMap in head of JSP --%>
<jsp:useBean id="myTreeMap" class="Accessor" scope = "session">
</jsp:useBean>
...
<%-- use myTreeMap in JSP: handler reads data from database --%>
<%  myTreeMap.readTreeMap(application);
 ... use myTreeMap ...
 %>

---------- Accessor fragment -------------
 ...
  private TreeMap theMap;
  private DatabaseBean myBean;
 ...
   public Accessor(ServletContext application) {
    theMap = new TreeMap();
  myBean = new DatabaseBean();

   }
   ...
  public synchronized TreeMap readTreeMap (ServletContext application) {

   theMap.clear();
   try {
      myBean.select(); // creates SQL-Statement and resultSet
      List theResultList = myBean.buildResultList();
       for(Iterator it=theResultList.iterator();it.hasNext();) {
          MyObject myObject = (MyObject) it.next() ;
          theMap.put(new Integer(myObject.getObjectid()),myObject) ;
       }
       myBean.cleanup() ;
   } catch (Exception e ) {
   }
   return theMap ;
   }

---------- DatabaseBean fragment -------------
    ...
    private ResultSet rs;
    private Statement st = null;
    private ArrayList arraylist = new ArrayList();
    private int objectid, objectcontent;
    ...
    public void select() {
        try {
            if (rs != null) { rs.close(); rs = null;}
            if (st != null) { st.close(); st = null;}
            Connection tmp = PersistentConnection.getConnection();
            st = tmp.createStatement();
            String query = "SELECT * FROM databaseTable;";
            rs = st.executeQuery(query);
        } catch (Exception e) {
        }
    }
    ...
    // Create an object out of a db row for the Object type
    // and build a result List from it
    public List buildResultList() {
     arraylist.clear();
  if (rs != null && next()) {
      do {
    arraylist.add(new MyObject(objectid,objectContent));
      } while(next());
  }
  return arraylist;
    }

    public void cleanup() {
        try {
            if (rs != null) rs.close();
            if (st != null) st.close();
        } catch (Exception e) {
         System.out.println("No Cleanup possible in DatabaseBean");
        }
    }

---------- End fragments -------------




Mediadom audiovisuelle Medien GmbH
Merheimer Str. 151
D-50733 Koeln