如何优化此更新SQL查询

时间:2012-07-26 12:05:16

标签: java sql oracle11g

我有这个Java方法,我将用它将数据从JSF表单插入Oracle:

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 个答案:

答案 0 :(得分:3)

  

现在我无法测试SQL查询。你能告诉我它是否有效......

没有任何确定性。 (你为什么不等到你能测试它?)

  

...以及如何针对性能优化SQL查询?

目前还不完全清楚你要做什么。但是,这里有一些关于性能的建议:

  • 您正在为每个执行的SQL语句创建和释放数据库连接。这对性能不利。
  • 没有必要进行插入,然后更新相同的记录......如果这是您要提出的建议。
  • 您可以通过批量或批量插入或更新来获得性能,而不是一次插入一个记录。
  • 如果要将大量数据插入到包含大量索引的空表中,那么如果先执行插入并在之后创建索引,则可能会获得更好的性能。

在单个查询的级别(即“更新”),您可能无法更快地使查询显着

答案 1 :(得分: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);

答案 2 :(得分:1)

我认为没有什么可以优化的,因为你只插入一个表。更新相同。没有连接或分组,所以你可以做任何事情。也许只有一个注释 - 您可以使用StringBuilder进行代码格式化: - )

答案 3 :(得分:1)

如果要插入多行,则可以通过重用数据库连接以及预准备语句来提高性能。后者需要将用户ID也作为一行处理,方法是ftom2 suggested。除此之外,性能优化的空间很小。

相关问题