-1

データベースにアクセスし、BB アプリケーションに応答するサーブレットを作成しました...開発中は正常に動作していました...しかし、Tomcat サーバー 6.0 にロードした後、稼働後にサーブレットを毎朝リロードする必要があります。 tomcatサーバー....その後、一日中正常に動作します..しかし、翌朝何かをリクエストすると、応答として空白のページが表示され、サーバー管理者はサーブレットをリロードする必要があると伝えます...ホストされている他のアプリケーションサーバーは正常に動作しており、再起動は必要ありません...

何が問題なのだろうか....

コードを追加する..それが役立つ場合

    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 AM 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 がロードされていません。サーブレット仕様 2.3 のセクション 9.7.2 を参照してください。問題のあるクラス: javax/servlet/Servlet.class

4

2 に答える 2

0

原因は、おそらくConnection. Connectionこの問題は、DBを閉じずに常に開いたままにしておくと発生する可能性があります。DBConnectionが開かれている時間が長すぎると、DB はタイムアウトになり、再利用されます。これはおそらく一晩で起こったことです。

DataAccessBBRequestProcessorServletをそのように再設計して、 をどこにも保持しないようにConnectionStatementResultSetインスタンス変数として、またはさらに悪いことにstaticクラスの変数として保持しないようにする必要があります。ConnectionSQLクエリ/クエリを実行している場所とまったく同じスコープで作成する必要があり、作成した場所とまったく同じブロックのブロックで閉じる必要がありfinallyますtry

ちなみに、jsonStringサーブレットのインスタンス変数としても絶対に宣言しないでください。この方法ではスレッドセーフではありません。

以下も参照してください。

ログに表示されているエラーに関しては、問題のある JAR を確実に削除する必要があります。Eclipse プロジェクトに javax.servlet API をインポートするにはどうすればよいですか?も参照してください。

于 2012-07-20T13:47:20.813 に答える
0

私は推測しており、あなたのログを見た後、より明確になるでしょう。

servlet-api.jar を WEB-INF lib に入れているようですが、既に tomcat の lib に入っています。

于 2012-07-20T12:18:16.607 に答える