1

JSFフォームからOracleにデータを挿入するために使用する次のJavaメソッドがあります。

public int saveData(int result) throws SQLException, java.text.ParseException, NoSuchAlgorithmException {

        String SqlStatement = null;

        if (ds == null) {
            throw new SQLException();
        }

        Connection conn = ds.getConnection();
        if (conn == null) {
            throw new SQLException();
        }

        PreparedStatement ps = null;

        /*

        CREATE TABLE USERS(
            USERID INTEGER NOT NULL,
            GROUPID INTEGER,
            SPECIALNUMBER VARCHAR2(60 ),
            USERNAME VARCHAR2(50 ),
            PASSWD VARCHAR2(50 ),
            DATETOCHANGEPASSWD DATE,
            ADDRESS VARCHAR2(60 ),
            STATEREGION VARCHAR2(50 ),
            COUNTRY VARCHAR2(50 ),
            USERSTATUS VARCHAR2(30 ),
            TELEPHONE VARCHAR2(50 ),
            DATEUSERADDED DATE,
            USEREXPIREDATE DATE,
            DATEUSERLOCKED CHAR(20 ),
            CITY VARCHAR2(50 ),
            EMAIL VARCHAR2(50 ),
            DESCRIPTION CLOB
        )
        /
        */

        try {
            conn.setAutoCommit(false);
            boolean committed = false;
            try {           /* insert into Oracle the default system(Linux) time */
        InsertSqlStatement = "INSERT INTO USERS"
                        + " (USERID, GROUPID, SPECIALNUMBER, USERNAME, PASSWD, DATETOCHANGEPASSWD,"
                        + " ADDRESS, STATEREGION, COUNTRY, USERSTATUS, TELEPHONE, DATEUSERADDED," 
                        + " USEREXPIREDATE, DATEUSERLOCKED, CITY, EMAIL, DESCRIPTION)"
                        + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        UpdateSqlStatement = "UPDATE USERS "
                                + "SET "
                                    + "USERID = ?, "
                                    + "GROUPID = ?, "
                                    + "SPECIALNUMBER = ?, "
                                    + "USERNAME = ?, "
                                    + "PASSWD = ?, "
                                    + "DATETOCHANGEPASSWD = ?, "
                                    + "ADDRESS = ?, "
                                    + "STATEREGION = ?, "
                                    + "COUNTRY = ?, "
                                    + "USERSTATUS = ?, "
                                    + "TELEPHONE = ?, "
                                    + "DATEUSERADDED = ?, "
                                    + "USEREXPIREDATE = ?, "
                                    + "DATEUSERLOCKED = ?, "
                                    + "CITY = ?, "
                                    + "EMAIL = ?, "
                                    + "DESCRIPTION = ? "
                        + "WHERE USERID = " + id;

                ps = conn.prepareStatement(SqlStatement);

                ps.setString(1, settingsMap.get("USERID"));
                ps.setString(2, settingsMap.get("GROUPID"));
                ps.setString(3, settingsMap.get("SPECIALNUMBER"));
                ps.setString(4, settingsMap.get("USERNAME"));
                ps.setString(5, passwdConvert(settingsMap.get("PASSWD")));
                ps.setDate(6, toDate(settingsMap.get("DATETOCHANGEPASSWD")));
                ps.setString(7, settingsMap.get("ADDRESS"));
                ps.setString(8, settingsMap.get("STATEREGION"));
                ps.setString(9, settingsMap.get("COUNTRY"));
                ps.setString(10, settingsMap.get("USERSTATUS"));
                ps.setString(11, settingsMap.get("TELEPHONE"));
                ps.setDate(12, toDate(settingsMap.get("DATEUSERADDED")));
                ps.setDate(13, toDate(settingsMap.get("USEREXPIREDATE")));
                ps.setDate(14, toDate(settingsMap.get("DATEUSERLOCKED")));
                ps.setString(15, settingsMap.get("CITY"));
                ps.setString(16, settingsMap.get("EMAIL"));
                ps.setString(17, settingsMap.get("DESCRIPTION"));

                ps.executeUpdate();

                conn.commit();
                committed = true;
            }
            finally 
            {
                if (!committed) {
                    conn.rollback();
                }
            }
        } finally {
            /* Release the resources */
            ps.close();
            conn.close();
        }
        return result;
    }

現在、SQLクエリをテストできません。それが有効であり、パフォーマンスのためにSQLクエリを最適化する方法を教えてください。

4

4 に答える 4

3

現在、SQLクエリをテストできません。有効か教えていただけますか...

確かではありません。(テストできるようになるまで待ってみませんか??)

...そしてSQLクエリのパフォーマンスを最適化するにはどうすればよいですか?

あなたが何をしようとしているのかは完全には明らかではありません。ただし、パフォーマンスに関するいくつかの提案があります。

  • 実行されるSQLステートメントごとにデータベース接続を作成および解放します。それはパフォーマンスに悪いことです。
  • 挿入してから同じレコードを更新する必要はありません...それがあなたが提案していることである場合。
  • レコードを一度に1つずつ挿入するのではなく、一括挿入またはバッチ挿入または更新を実行することで、パフォーマンスが向上します。
  • 多数のインデックスを含む空のテーブルに大量のデータを挿入する場合は、最初に挿入を実行し、後でインデックスを作成すると、パフォーマンスが向上する可能性があります。

単一のクエリ(つまり「UPDATE」)のレベルでは、クエリを大幅に高速化 することはおそらく不可能です。

于 2012-07-26T12:18:54.023 に答える
2

あなたができる唯一の改善はid、「?」として置くことです。また:

UPDATE USERS "
                            + "SET "
                                + "USERID = ?, "
                                + "GROUPID = ?, "
                                + "SPECIALNUMBER = ?, "
                                + "USERNAME = ?, "
                                + "PASSWD = ?, "
                                + "DATETOCHANGEPASSWD = ?, "
                                + "ADDRESS = ?, "
                                + "STATEREGION = ?, "
                                + "COUNTRY = ?, "
                                + "USERSTATUS = ?, "
                                + "TELEPHONE = ?, "
                                + "DATEUSERADDED = ?, "
                                + "USEREXPIREDATE = ?, "
                                + "DATEUSERLOCKED = ?, "
                                + "CITY = ?, "
                                + "EMAIL = ?, "
                                + "DESCRIPTION = ? "
                    + "WHERE USERID = ?";

そしてもちろん、セットのデクレレーションを追加します。

 ps.setInt(18, id);
于 2012-07-26T12:14:54.427 に答える
1

1つのテーブルにしか挿入しないため、最適化するものは何もないと思います。更新についても同じです。結合やグループ化はないので、実際にできることは何でもあります。たぶん1つのメモ-StringBuilderコードのフォーマットに使用できます:-)

于 2012-07-26T12:12:53.393 に答える
1

複数の行を挿入する場合は、データベース接続とプリペアドステートメントを再利用することでパフォーマンスを向上させることができます。後者では、ftom2が提案したように、ユーザーIDも行として扱う必要があります。それを除けば、パフォーマンスを最適化する余地はほとんどありません。

于 2012-07-26T12:18:14.793 に答える