0

サーブレットに更新クエリがあります。構文は正しいのですが、クエリを実行しても何も起こりません。実行は凍結されたままになり、コマンドは決して終了しません。数分後、「ADVERTENCIA: GRIZZLY0023: Interrupting idle Thread: http-thread-pool-8080(5)」というメッセージが表示されます。数秒ごとに印刷されます

私は試してみました:

con.stmt.executeUpdate ("SQL");
con.rset = con.stmt.executeQuery ("SQL");

および PreparedStatement を使用します。

これはクエリです:

System.out.println(""
                    + " UPDATE JSP_TABLE SET "
                    + " field1        = '" + request.getParameter("input1") + "',"
                    + " field2= '" + request.getParameter("input2") + "',"
                    + " field3= '" + request.getParameter("input3") + "',"
                    + " field4= '" + request.getParameter("input4") + "',"
                    + " field5= '" + request.getParameter("input5") + "',"
                    + " field6= '" + request.getParameter("input6") + "',"
                    + " field7= '" + request.getParameter("input7") + "',"
                    + " field8= '" + indicador + " VS " + request.getParameter("input8") + "',"
                    + " field9= '" + request.getParameter("input") + " al " + request.getParameter("hasta9") + "'"
                    + " WHERE ID_PK = " + request.getParameter("inputPK"));

すべてのステートメント、ResultSet、および接続は、使用終了時に閉じられます。正常に動作する 2 番目の更新があります。

    package Funciones;

    import conexion.conectar;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;


    public class ActualizarDinamica extends HttpServlet {

        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException, SQLException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            conectar con = new conectar();
            try {
                /*
                 * TODO output your page here. You may use following sample code.
                 */
                con.stmt = con.conn.createStatement();

                String indicador = "";
                switch (Integer.parseInt(request.getParameter("indicador"))) {
                    case 1:
                        indicador = "Nivel de Servicio";
                        break;
                    case 2:
                        indicador = "Venta";
                        break;
                    case 3:
                        indicador = request.getParameter("txt_otro");
                        break;
                    case 0:
                        indicador = "Presencia";
                        break;
                };

                 /* way 1   
                  * con.rset = con.stmt.executeQuery(""
                        + " UPDATE JSP_TABLE SET "
                        + " FIELD1        = '" + request.getParameter("input1") + "',"
                        + " FIELD2           = '" + request.getParameter("input2") + "',"
                        + " FIELD3          = '" + request.getParameter("input3") + "',"
                        + " FIELD4  = '" + request.getParameter("input4") + "',"
                        + " FIELD5         = '" + request.getParameter("input5") + "',"
                        + " FIELD6       = '" + request.getParameter("input6") + "',"
                        + " FIELD7          = '" + request.getParameter("input7") + "',"
                        + " FIELD8         = '" + indicador + " VS " + request.getParameter("input8") + "',"
                        + " FIELD9     = '" + request.getParameter("input9") + " al " + request.getParameter("input10") + "'"
                        + " WHERE FIELD_PK = " + request.getParameter("input11_ID")); 

              con.rset = con.stmt.executeQuery(""
                        + " UPDATE JSP_TABLE2 SET"
                        + " FIELD_DATE =  TO_DATE('" + request.getParameter("input12") + " " + request.getParameter("input14") + ":" + request.getParameter("input13") + "','DD/MM/YYYY HH24:MI')"
                        + " WHERE FIELD_ID = " + request.getParameter("input11_ID"));

*/


              /*  way 2
                con.stmt.executeUpdate(""
                        + " UPDATE JSP_TABLE SET "
                        + " FIELD1        = '" + request.getParameter("input1") + "',"
                        + " FIELD2           = '" + request.getParameter("input2") + "',"
                        + " FIELD3          = '" + request.getParameter("input3") + "',"
                        + " FIELD4  = '" + request.getParameter("input4") + "',"
                        + " FIELD5         = '" + request.getParameter("input5") + "',"
                        + " FIELD6       = '" + request.getParameter("input6") + "',"
                        + " FIELD7          = '" + request.getParameter("input7") + "',"
                        + " FIELD8         = '" + indicador + " VS " + request.getParameter("input8") + "',"
                        + " FIELD9     = '" + request.getParameter("input9") + " al " + request.getParameter("input10") + "'"
                        + " WHERE FIELD_PK = " + request.getParameter("input11_ID"));


                con.stmt.executeUpdate(""
                        + " UPDATE JSP_TABLE2 SET"
                        + " FIELD_DATE =  TO_DATE('" + request.getParameter("input12") + " " + request.getParameter("input14") + ":" + request.getParameter("input13") + "','DD/MM/YYYY HH24:MI')"
                        + " WHERE FIELD_ID = " + request.getParameter("input11_ID"));
                     */

                //way 3
                PreparedStatement updateSmallQuery = null;
                PreparedStatement updateBigQuery = null;

                String bigQuery=
                        ""
                        + " UPDATE JSP_TABLE SET "
                        + " FIELD1        = '" + request.getParameter("input1") + "',"
                        + " FIELD2           = '" + request.getParameter("input2") + "',"
                        + " FIELD3          = '" + request.getParameter("input3") + "',"
                        + " FIELD4  = '" + request.getParameter("input4") + "',"
                        + " FIELD5         = '" + request.getParameter("input5") + "',"
                        + " FIELD6       = '" + request.getParameter("input6") + "',"
                        + " FIELD7          = '" + request.getParameter("input7") + "',"
                        + " FIELD8         = '" + indicador + " VS " + request.getParameter("input8") + "',"
                        + " FIELD9     = '" + request.getParameter("input9") + " al " + request.getParameter("input10") + "'"
                        + " WHERE FIELD_PK = " + request.getParameter("input11_ID");

                String smallQuery= ""
                        + " UPDATE JSP_TABLE2 SET"
                        + " FIELD_DATE =  TO_DATE('" + request.getParameter("input12") + " " + request.getParameter("input14") + ":" + request.getParameter("input13") + "','DD/MM/YYYY HH24:MI')"
                        + " WHERE FIELD_ID = " + request.getParameter("input11_ID");
                try {
                    con.conn.setAutoCommit(false);
                    updateSmallQuery = con.conn.prepareStatement(smallQuery);
                    updateBigQuery = con.conn.prepareStatement(bigQuery);
                    updateBigQuery.executeUpdate();
                    updateSmallQuery.executeUpdate();
                    con.conn.commit();
                } catch (SQLException e) {
                    System.out.println("catch!");
                    System.out.println(e.getMessage());
                    if (con != null) {
                        try {
                            System.err.print("Transaction is being rolled back");
                            con.conn.rollback();
                        } catch (SQLException excep) {
                        }
                    }
                } finally {
                    if (updateSmallQuery != null) {
                        updateSmallQuery.close();
                    }
                    if (updateBigQuery != null) {
                        updateBigQuery .close();
                    }
                    con.conn.setAutoCommit(true);
                }
                response.sendRedirect("sol_env_c.jsp");

            } finally {
                con.conn.commit();
                con.conn.close();
                con.stmt.close();
                out.close();
            }
        }

    }

これが答えを見つけるのに役立つことを願っています。PD: 小さなものは問題なく動きます。大きな問題です。

編集:

これはコネクタ()です

public conectar() {
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            System.out.println("Oracle JDBC driver loaded ok.");
            conn = DriverManager.getConnection(params, user, password);
        } catch (Exception e) {
            System.err.println("Exception: " + e.getMessage());
        }
    }
4

1 に答える 1

0

ビルはほぼ間違いなく正しいです。更新しようとしている行をロックしているだけです。「構文は正しい」とおっしゃいましたが、これは、SQL*Plus や SQL Developer などを使用してデータベースで直接チェックした可能性があり、そのセッションでrollback(または) を発行していないことを示唆しています。commitコードから同じ行を更新しようとすると、ロックが解放されるのを待ってハングします。

更新を手動で実行したセッションが見つかった場合は、そのセッションで a を発行rollbackします。できない場合は、次のようなクエリを使用して、どのセッションがロックを保持しているかを確認できます。

select vs.osuser, vs.process, vs.logon_time, vs.sid, vs.serial#, vs.program,
    dl.lock_type, dl.mode_held, dl.blocking_others
from dba_locks dl
left join v$session vs on vs.sid = dl.session_id
where lock_type != 'Media Recovery'
and lock_type != 'Redo Thread';

コードが実行されている間 (そしてハングしている間)、次のようなコードでコードをブロックしているものを確認できます。

select vsw.osuser, vsw.process, vsw.logon_time, vsw.sid, vsw.program,
    dw.lock_type, dw.mode_held,
    vsh.osuser, vsh.process, vsh.logon_time, vsh.sid, vsh.serial#, vsh.program
from dba_waiters dw
left join v$session vsw on vsw.sid = dw.waiting_session
left join v$session vsh on vsh.sid = dw.holding_session;

または、 thisなどの他の例を検索してください。パフォーマンス ビューを照会するには権限が必要です。権限v$がない場合は、DBA の支援が必要になる場合があります。ロックを手動でロールバックできない場合は、とにかくロック セッションを強制終了するために DBA の助けが必要になる場合があります。

ステートメントのパラメーター化に関するコメントにも注意を払う必要があります。

于 2012-08-30T19:16:29.830 に答える