2009-03-04 73 views
1

我正在尋求減少應用程序中的往返以提高性能。我想用PreparedStatement來獲得衆多好處。SQL:綁定變量的批處理語句

這是我想出..全身用省略的細節的例子..

Class.forName("..Driver"); 
    Connection connection = DriverManager.getConnection(..);  
    PreparedStatement statement = connection.prepareStatement("UPDATE Table SET XmlData = ? WHERE SomeGUID = ?; INSERT INTO SomeTable (Col1,Col2) VALUES (?, ?)"); 

    try{ 
    statement.setString(1, "<XmlData></XmlData>"); 
    statement.setString(2, "32ABD5-438B0-.."); 
    statement.setString(3, "ABC"); 
    statement.setString(4, "XYZ"); 
    statement.execute(); 
    connection.commit(); 
    } 
    catch { 
    connection.rollback(); 
    } 
    finally { 
    statement.close(); 
    connection.close(); 
    } 

(同樣,這是不實際的代碼,只是一個簡單的例子)

通常,我試圖在單個語句中執行多個插入/更新語句以減少往返流量。這是一種行之有效的方法嗎?還是有一種更爲接受的方法?

我可以爲單個事務處理數千條語句。我可能會將語句分割成合理大小的塊,以防止單個語句的執行超時。

我將支持多個數據庫供應商,但將使用ANSI SQL,因此不應該有問題。如果需要,我可以利用我的DAL的智能。所以,這是一個非問題。

任何提示/建議?

回答

0

PreparedStatement支持批量使用addBatchexecutebatch提交具有不同參數的相同語句。我不認爲有一種以跨數據庫平臺方式執行多個參數化語句的好方法。傳統上這將由[邪惡]存儲過程處理。

2

下面是Oracle JDBC手冊的一個例子。這被描述爲「標準」(非特定於Oracle的)方法。

PreparedStatement pstmt = 
      conn.prepareStatement("INSERT INTO employees VALUES(?, ?)"); 

pstmt.setInt(1, 2000); 
pstmt.setString(2, "Milo Mumford"); 
pstmt.addBatch(); 

pstmt.setInt(1, 3000); 
pstmt.setString(2, "Sulu Simpson"); 
pstmt.addBatch(); 
... 
int[] updateCounts = pstmt.executeBatch(); 
1

順便說一句,如果你;再擔心peformance,你應該考慮使用連接池包像dbcp,也將支持PreparedStatement的池。 c3p0也很受歡迎,但我沒有任何經驗。