2012-07-26 89 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」),你可能無法使查詢顯著更快。