2012-07-26 91 views
1

我有我将使用从JSF表单数据插入到Oracle中的Java方法:如何优化此更新SQL查询

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查询的性能?

回答

2

您可以做的唯一改进是将id设置为'?'也:

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

当然并添加一组decleration:

ps.setInt(18, id); 
1

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

+1

在这种情况下,使用StringBuilder会对性能产生负面影响:连接字符串文字作为一个大字符串保存在类文件中,而StringBuilder调用将在运行时执行。 – MvG 2012-07-26 12:19:38

+0

即使字符串程序集在运行时完成,Java编译器也会生成使用StringBuilder的代码。 – 2012-07-26 12:22:30

1

如果你要插入几行,那么你可以通过重用数据库连接提高性能,以及准备好的声明。后者还需要将用户标识作为一行来处理,方式为ftom2 suggested。除此之外,性能优化的空间不大。

3

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

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

...以及我如何优化SQL查询的性能?

这是不完全清楚你想要做什么。但是,以下是有关性能的一些建议:

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

在单个查询级别(即“UPDATE”),你可能无法使查询显著更快。