2011-12-02 63 views
0

我有一個SQL查詢,如下所示。什麼是BatchStatement執行從數據庫中獲取值的最佳選擇(MSSQL 2008)

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID =? 

將一個Ids集合傳遞給此查詢並作爲批處理查詢運行。這會執行10000周 時間從數據庫retriveing值。(是別人亂)

public static Map getOBLDefinitionsAsMap(Collection oblIDs) 
     throws java.sql.SQLException 
    { 
     Map retVal = new HashMap(); 
     if (oblIDs != null && (!oblIDs.isEmpty())) 
     { 
      BatchStatementObject stmt = new BatchStatementObject(); 
      stmt.setSql(SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID=?); 
      stmt.setParameters(
        PWMUtils.convertCollectionToSubLists(taskIDs, 1));   
      stmt.setResultsAsArray(true); 
      QueryResults rows = stmt.executeBatchSelect(); 
      int rowSize = rows.size(); 
      for (int i = 0; i < rowSize; i++) 
      { 
       QueryResults.Row aRow = (QueryResults.Row) rows.getRow(i); 
       CoblDefinition ctd = new CoblDefinition(aRow); 


       retVal.put(aRow.getLong(0), ctd); 
      } 
     } 

     return retVal; 

現在我們已經確定的是,如果查詢被修改爲 添加爲

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID in (???) 

這樣我們就可以將其減少到1個查詢。

這裏的問題是MSSQL服務器拋出異常

Prepared or callable statement has more than 2000 parameter 

在這裏被擊中。有人可以提供任何更好的替代

回答

1

允許的最大參數數量,我們稱之爲n。您可以執行下列操作之一:

  • 如果您有M * N + K參數,你可以創建米批次(或M + 1個批次,如果k不爲0)。如果您有10000個參數,並且2000是允許的最大參數,則您只需要5個批次。

  • 另一種解決方案是在您的應用程序中生成查詢字符串並將您的參數添加爲字符串。這樣你只會運行一次查詢。這是一個顯而易見的速度優化,但是您的應用程序中會生成一個查詢字符串。你可以像這樣設置你的Where子句:

String myWhereClause =「where TaskID =」+ taskIDs [0];

對(INT I = 1;我< numberOfTaskIDs;我++)

{

myWhereClause += " or TaskID = " + taskIDs[i]; 

}

+0

好主意..可以用上面的代碼詳細說明一下。謝謝 – GustyWind

1

它看起來像你在PreparedStatement和addBatch()周圍使用自己的包裝。您清楚地達到了可以一次批量處理多少個語句/參數的限制。您需要使用executeBatch(例如每100或1000個)語句,而不是在達到限制之前建立它。

編輯:根據下面的評論,我重讀了這個問題。解決方案:確保在構建查詢時使用少於2000個參數。如有必要,根據需要將其分成兩個或更多個查詢。

+0

我不想使用批次。因爲它運行的是10000次。相反,使用具有固定參數集的'in'子句的Statement對象。 – GustyWind

相關問題