I hope someone can point me in the right direction on how to resolve the
following issue.  Our environment is

        Windows NT (Service Pack 5 and 6); have also seen this on Solaris
5.8
        Apache 1.3.26
        Tomcat 3.3.1
        Struts 1.1 Beta 2
        Java 2 SDK 1.4.0_01

We have an application that access data from an Oracle 8.1.7 DB based on
various user input.  After about 15 or 18 queries, the application appears
to 'hang' - i.e. nothing ever ends up coming back.  When I stop Tomcat, I
get the following stack trace (could be due to stopping Tomcat - I'm not
sure):

Error: 500
Location: /aefa/QueryRecordAction.do
Internal Servlet Error:
java.lang.NullPointerException
        at
org.apache.struts.action.RequestProcessor.getServletContext(RequestProcessor
.java:1076)
        at
org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRe
questProcessor.java:175)
        at
org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequ
estProcessor.java:291)
        at
org.apache.struts.action.RequestProcessor.processActionForward(RequestProces
sor.java:390)
        at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:271)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1292)
        at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:510)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java)
        at
org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:574)
        at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
        at org.apache.tomcat.core.Handler.service(Handler.java:235)
        at
org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:485)
        at
org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:91
7)
        at
org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
        at
org.apache.tomcat.modules.server.Ajp13Interceptor.processConnection(Ajp13Int
erceptor.java:341)
        at
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.jav
a:516)
        at java.lang.Thread.run(Thread.java:536)

I've monitored the memory usage on WinNT using the task manager; each query
results in an increase in memory usage of between 300 and 400k.  I don't
ever see any memory being reclaimed (this is under the 'java' task which is
Tomcat.)  QueryRecordAction does a SELECT, then builds a nested bean to hold
the returned 'rows' - the is another bean that holds the actual data.  The
code for the two beans is

        Results.java

                public class Results {
                        private Vector results;

                        public Results() {
                                this.results = new Vector();
                        }

                        public Vector getResults() {
                                return this.results;
                        }
                        public void addRow(Row row) {
                                this.results.add(row);
                        }
                        public void clear() {
                                this.results.clear();
                        }
                }

        Row.java

                public class Row {
                        private String name;
                        private String address;  // etc. etc. etc.

                        public Row() {
                                this.name = "";
                                this.address = "";
                        }
                        /* normal getters */
                        public String getName() {
                                return this.name;
                        }
                        public String getAddress() {
                                return this.address;
                        }
                        /* normal setters */
                        public void setName(String name) {
                                this.name = name;
                        }
                        public void setAddress(String address) {
                                this.address = address;
                        }
                }

QueryRecordAction cleans up the previous set of beans (if they exist), then
rebuilds the beans and puts the bean back into the session.

        QueryRecordAction

                public class QueryRecordAction extends Action {
                        PreparedStatement ps = null;
                        ResultSet rs = null;

                        public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                                HttpSession session = request.getSession();
                                if (session.getAttribute("results") != null)
{
                                        Results results = (Results)
session.getAttribute("results");
                                        results.clear();
                                        session.removeAttribute("results");
                                }

                                Results results = new Results();

                                String queryName = (String)
PropertyUtils.getSimpleProperty(form, "queryName");
                                try {
                                        DataSource ds = (DataSource)
servlet.getServletContext().getAttribute("AEFA");  // key for datasource in
struts-config
                                        Connection con = ds.getConnection();
                                        ps = con.PrepareStatement("SELECT
name, address from aefa_order where query_name = ?");
                                        ps.setString(1, queryName);
                                        rs = ps.executeQuery();
                                        while(rs.next()) {
                                                Row row = new Row();
        
row.setName(rs.getString("name"));
        
row.setAddress(rs.getString("address"));

                                                results.addRow(row);
                                        }
                                        session.setAttribute("results",
results);
                                        rs = null;
                                        ps = null;
                                        con = null;
                                        ds = null;
                                }
                                catch(Exception e) {
                                        ActionErrors errors = new
ActionErrors();
                                        errors.add("internal_error", new
ActionError("internal.error", e.getMessage()));
                                        saveErrors(request, errors);
                                        return
(mapping.findForward("error"));
                                }
                                return (mapping.findForward("success"));
                        }
                }

The "success" forward displays a table of all the rows that were returned.
Everything works just like I would expect it to, except for Tomcat hanging
after 15 or 18 queries.  I've been through the code and can't find where I
would have a memory leak - if anyone can spot one, or has other ideas,
please let me know!

Thanks!


Jerry Jalenak
Web Publishing
LabOne, Inc.
10101 Renner Blvd.
Lenexa, KS  66219
(913) 577-1496
[EMAIL PROTECTED]


This transmission (and any information attached to it) may be confidential and is 
intended solely for the use of the individual or entity to which it is addressed. If 
you are not the intended recipient or the person responsible for delivering the 
transmission to the intended recipient, be advised that you have received this 
transmission in error and that any use, dissemination, forwarding, printing, or 
copying of this information is strictly prohibited. If you have received this 
transmission in error, please immediately notify LabOne at (800)388-4675.



--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to