Servlet日記(1999/11/13)

本日の成果

 今回は、前々回の内容を元に、トランザクションとメタデータを試してみました。ここで使っているデータベースは、IDが文字列型になっています。したがってIDとして数値以外でも入力可能です。以下のプログラムでは、executeUpdate()でデータベースに登録してから、Integer.parseInt()でIDを整数にしようとします。これが成功すればcommit()を実行してデータベースへの登録を確定し、例外が発生すればrollback()で登録を取り消します。それを可能にするために、あらかじめsetAutoCommit()メソッドにより自動コミットをOFFにしておきます。

 一覧表表示では、ResultSetのメタデータから列数と列名を得て表示します。これはいいのですが、列番号が1から始まるところが、なんともすっきりしませんね。

 ところで、このプログラムは、複数のクライアントからの同時アクセスには対応していません。SingleThreadModelにするか、コネクションプールを作るかしかないと思うのですが、それはまたそのうち。

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String id, name, belong;
    String sql;

    String dbID     = request.getParameter("formID");
    String dbName   = request.getParameter("formName");
    String dbBelong = request.getParameter("formBelong");

    Statement stmt = null;

    try {
      con.setAutoCommit(false);

      stmt = con.createStatement();

      sql = "INSERT INTO SHAIN (ID, NAME, BELONG) VALUES('" + dbID + "','" + dbName + "','" + dbBelong + "')";
      stmt.executeUpdate(sql);
      log("executeUpdate ok");

      log("id=" + Integer.parseInt(dbID));

      con.commit();
      log("commit ok");
    } catch (Exception e) {
      try {
        con.rollback();
        log("rollback ok");
      } catch (Exception e2) {
      }
      e.printStackTrace();
    } finally {
      try {
        stmt.close();
        con.setAutoCommit(true);
      } catch (Exception e2) {
      }
    }

    doGet(request, response);
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    try {
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT ID, NAME, BELONG FROM SHAIN");
      ResultSetMetaData rsmd = rs.getMetaData();

      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head><title>Servlet1</title></head>");
      out.println("<body>");
      out.println("<table border>");

      out.println("<tr>");
      for (int i = 1; i <= rsmd.getColumnCount(); i++)
        out.println("<th>" + rsmd.getColumnLabel(i));

      while (rs.next()) {
        out.println("<tr>");
        for (int i = 1; i <= rsmd.getColumnCount(); i++)
          out.println("<td>" + rs.getObject(i).toString());
      }

      out.println("</table>");
      out.println("</body></html>");
      out.close();

      rs.close();
      stmt.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

本日の教訓

 トランザクションの簡単な実現方法が分かったような。しかし、Connectionを操作するので、Connectionを共有できなくなることに注意。

Servlet日記(1999/11/12) Servlet日記の目次 Servlet日記(1999/11/14)