servlet必须每天重新加载

时间:2012-07-20 05:29:40

标签: servlets tomcat6

我已经创建了一个servlet来访问数据库并给BB应用程序做出响应......它在开发过程中运行正常......但是在运行之后将它加载到tomcat服务器6.0之后,必须每次重新加载servlet早上在tomcat服务器....之后它在​​一整天工作正常..但第二天早上当我请求的东西它给出一个空白页作为响应和我的服务器管理员告诉servlet必须重新加载... 托管在服务器上的其他应用程序工作正常,不需要重新启动......

可能是什么问题......

添加代码..如果有帮助

    package com.ams.servlets;
    import java.io.*;
    import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;

import com.cms.dbaccess.DataAccess;
import com.cms.utils.ApplicationConstants;
import com.cms.utils.ApplicationHelper;

import java.sql.ResultSet;
public class BBRequestProcessorServlet extends HttpServlet {
/**
 * 
 */String userString;
 private static final long serialVersionUID = 1L;
 String jsonString = "";
 ResultSet rs = null;
 Connection connection = null;
 Statement statement=null;

 public enum db_name
 { 
     //Test
     resource_management_db,osms_inventory_db; 

 }
 public void init(ServletConfig config)throws ServletException
 {
     super.init(config);

     System.out.println("Inside init");




 }

 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException 
 {
     try{
         connection = DataAccess.connectToDatabase("xxx", connection);
         statement = DataAccess.createStatement(connection); 

         statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

         rs = statement.executeQuery("query is here");
     }
     catch(SQLException e)
     {
         e.printStackTrace();
     }
     String db =request.getParameter("db");
     System.out.println("DATABASE NAME :"+ db);
     if(db.equalsIgnoreCase("xxx")){ 
         //Call to populate JSONArray with the fetch ResultSet data
         jsonString = ApplicationHelper.populateJSONArray(rs);
     }
     response.setContentType(ApplicationConstants.JSON_CONTENT_TYPE);
     PrintWriter out = response.getWriter();
     out.print(jsonString);      
     out.flush();
     out.close();
     System.out.println("json object sent");
     try {
        rs.close();

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

 }   
 }

我能找到的唯一错误是    2012年7月20日上午9:57:24 org.apache.catalina.loader.WebappClassLoader validateJarFile    INFO:validateJarFile(/usr/local/tomcat/apache-tomcat-6.0.20/webapps/MobileServlet /WEB-INF/lib/servlet-api.jar) - jar未加载。请参阅Servlet规范2.3,第9.7.2节。违规类:javax / servlet / Servlet.class

2 个答案:

答案 0 :(得分:0)

我猜测,看到你的日志后会更清楚。

看起来你已经将你的servlet-api.jar放在了WEB-INF lib中,但它已经在tomcat的lib中了。

答案 1 :(得分:0)

罪魁祸首很可能是您处理外部数据库资源的方式,例如Connection。当您保持数据库Connection始终打开而不关闭它时,可能会发生此问题。当DB Connection被打开太长时间时,DB将超时并回收它。这很可能是一夜之间发生的事情。

您应该以这种方式重新设计DataAccessBBRequestProcessorServlet,以便无处保持ConnectionStatement和{{1}作为实例变量,或者更糟的是,该类的ResultSet变量。应该在与您执行SQL查询/查询的范围相同的范围内创建static,并且应该在同一Connection块的finally块中关闭try就像你创造它一样。

顺便说一下,你的jsonString绝对不应该被声明为servlet的实例变量,它不是这样的线程安全。

另见:

至于您在日志中看到的错误,您一定要删除有问题的JAR。另请参阅How do I import the javax.servlet API in my Eclipse project?