1

データベースが稼働しているかどうかを確認するために、データベースを継続的に (30 秒ごとに) ポーリングする必要があるダッシュボード アプリケーションを開発しています。データベースが機能しているかどうかを確認するために、テーブルから 1 行だけを取得する簡単なクエリを作成しています。

すべて正常に動作しますが、問題は、サーブレットがデータベースへの接続を確立して行を取得するのに異常に長い時間がかかることです。このプロセスには約 15 秒かかります。同じコードを Java ファイルにコピーして、まだそれほど時間がかかるかどうかを調べました。しかし、私が疑ったように、Java プログラムが実行されるまでにかかった時間はわずか 1 秒か 2 秒でした。私がこの全体にアプローチしている方法に何か問題があるようです。

データベースを繰り返しポーリングする必要があるため、doGet() 関数にデータベース接続コードを記述しました。これは私が犯している間違いですか?データベース接続コードを init() に記述し、クエリを doGet() 関数に記述するだけでよいですか?

どんな助けでも大歓迎です。ありがとう

私の問題を理解するのに役立つコードの一部を次に示します。

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Send Request to DB CAT
LinkedHashMap<String,String> hm=new LinkedHashMap<String,String>();
   try
   {
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    //CONNECT TO DB
    String serverName = "*****.1dc.com"; // * is just to hide the real database name
    int port = 1535;
    String user = "mbank";
    String password = "****";
    String SID = "mbkwqa";
    String URL = "jdbc:oracle:thin:@" + serverName + ":" + port + ":" + SID;
    Connection conndb = DriverManager.getConnection(URL, user, password);
    String SQL = "select CITY from ADDRESS where rownum<=1";
    Statement stat = conndb.createStatement();
    ResultSet rs = stat.executeQuery(SQL);
    while (rs.next()) 
    {
        System.out.println(rs.getString(1));
    }
    stat.close();
    conndb.close(); 
    hm.put("Server1","OK");
    }
      catch(Exception e)
    {
        hm.put("Server1","Failed");         
    }   
4

2 に答える 2

4

doGet 関数からデータベースに接続していますが、これは非常に悪い習慣です。サーブレットに 100、1000、10000 のリクエストがあるとどうなるでしょうか?

設計を確認する必要があります。

Oracle データ ソースへの接続プールを作成し、それを Servlet ApplicationContext に配置し、Dao クラスを作成して、doGet Servlet から Dao クラスを呼び出してください。

これらのチュートリアルが役立つと思います:

http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html

于 2012-04-27T16:23:47.050 に答える
2

これは、リクエストが来るたびにDBへの接続を構築するのは良い習慣ではありません。接続プールを作成する必要があります。接続時間を大幅に節約できます。Tomcat 接続プールまたは Apache DBCP を確認してください。

于 2012-04-27T16:22:48.840 に答える