-1

我创建了一个 servlet 来访问数据库并对 BB 应用程序做出响应......它在开发过程中运行良好......但是在将它加载到 tomcat 服务器 6.0 后,必须每天早上重新加载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

4

2 回答 2

0

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

似乎您已将 servlet-api.jar 放在 WEB-INF 库中,但它已经在 tomcat 的库中。

于 2012-07-20T12:18:16.607 回答
0

罪魁祸首很可能是您处理外部数据库资源(如Connection. 当您一直Connection打开数据库而不关闭它时,可能会发生此问题。当一个 DBConnection打开时间过长时,该 DB 将超时并回收它。这很可能是一夜之间发生的事情。

您应该以这种方式重新设计您的DataAccessBBRequestProcessorServlet,以便您无处持有ConnectionStatement并且ResultSet作为实例变量,或者更糟糕的是,static作为类的变量。Connection应该在与您执行 SQL 查询/查询的位置完全相同的范围内创建它,并且它应该在与您创建它的位置完全相同的块的finally块中关闭。try

顺便说一句,您jsonString绝对也不应该将其声明为 servlet 的实例变量,这种方式不是线程安全的。

也可以看看:

至于您在日志中看到的错误,您绝对应该删除有问题的 JAR。另请参阅如何在我的 Eclipse 项目中导入 javax.servlet API?

于 2012-07-20T13:47:20.813 回答