?? jdbc2.0.frame6.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="100%">
<tr>
<td><font size="-1"><a href="jdbc2.0.frame.html">目錄</a> | <a
href="jdbc2.0.frame5.html">上一頁</a> | <a href="jdbc2.0.frame7.html">下一頁</a> </font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入門</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="287821"></a> </p>
<h2>6 批處理更新</h2>
<p>批處理更新功能可以一次向數據庫提交多個更新操作,要求數據庫進行處理。一起提交多個更新(而非一個一個單獨地提交更新)在某些情況下將大大提高性能。可以利用
<code>Statement</code>、<code>PreparedStatement</code> 和 <code>CallableStatement </code>對象來提交批處理更新。</p>
<p><a name="283240"></a> </p>
<h3>6.1 批處理更新的使用</h3>
<h4>6.1.1 語句</h4>
<p>批處理更新功能允許 <code>Statement</code>
對象將一組相異的更新命令作為一個單位或批處理提交給基本 DBMS。下例中,在假想的公司數據庫中插入新雇員所需的所有更新操作是作為單個批處理提交的。</p>
<p><a name="283316"></a> </p>
<blockquote>
<pre>// 關閉自動執行
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");
// 提交一批要執行的更新命令
int[] updateCounts = stmt.executeBatch();
</pre>
</blockquote>
<p><a name="283392"></a></p>
<p>本例中禁用了自動執行模式,從而在調用 <code>Statement.executeBatch()</code>
時可以防止 JDBC
執行事務處理。禁用自動執行使得應用程序能夠在發生錯誤及批處理中的某些命令不能執行時決定是否執行事務處理。因此,當進行批處理更新時,通常應該關閉自動執行。</p>
<p>在 JDBC 2.0 中,<code>Statement</code>
對象能夠記住可以一起提交執行的命令列表。創建語句時,與它關聯的命令列表為空。<code>Statement.addBatch()
</code>方法為調用語句的命令列表添加一個元素。如果批處理中包含有試圖返回結果集的命令,則當調用
<code>Statement. executeBatch()</code> 時,將拋出 <code>SQLException</code>。只有
DDL 和 DML
命令(它們只返回簡單的更新計數)才能作為批處理的一部分來執行。如果應用程序決定不提交已經為某語句構造的命令批處理,則可以調用方法
<code>Statement.clearBatch()</code>(以上沒有顯示)來重新設置批處理。</p>
<p><code>Statement.executeBatch()</code> 方法將把命令批處理提交給基本 DBMS
來執行。命令的執行將依照在批處理中的添加順序來進行。<code>ExecuteBatch()
</code>為執行的命令返回更新計數數組。數組中對應于批處理中的每個命令都包含了一項,而數組中各元素依據命令的執行順序(這還是和命令的最初添加順序相同)來排序。調用
<code>executeBatch()</code> 將關閉發出調用的 <code>Statement</code>
對象的當前結果集(如果有一個結果集是打開的)。 <code>executeBatch()</code>
返回后,將重新將語句的內部批處理命令列表設置為空。</p>
<p><a name="284570"></a>如果批處理中的某個命令無法正確執行,則 <code>ExecuteBatch()</code>
將拋出 <code>BatchUpdateException</code>。可以調用 <code>BatchUpdateException.getUpdateCounts()</code>
方法來為批處理中成功執行的命令返回更新計數的整型數組。因為當有第一個命令返回錯誤時,<code>Statement.executeBatch()</code>
就中止,而且這些命令是依據它們在批處理中的添加順序而執行的。所以如果
<code>BatchUpdateException.getUpdateCounts() </code>所返回的數組包含 N
個元素,這就意味著在調用 <code>executeBatch()</code> 時批處理中的前 N
個命令被成功執行。</p>
<p><a name="301463"></a> </p>
<h4>6.1.2 預先準備好的語句</h4>
<p>批處理更新功能與預先準備好的語句一起配合使用時可將多個輸入參數值集合與一個
<code>PreparedStatement </code>對象相關聯。隨后,就能將參數值和關聯的參數化更新命令作為單一單元送交給基本
DBMS 引擎來執行。</p>
<p><a name="283428"></a>下例將兩條新增雇員記錄作為一次批處理插入到數據庫中。本例使用
<code>PreparedStatement.setXXX()</code>
方法來創建每個參數集合(每個雇員對應一個),而使用 <code>PreparedStatement.addBatch()</code>
方法將一組參數添加到當前批處理中。</p>
<p><a name="283503"></a> </p>
<blockquote>
<pre>// 關閉自動執行
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(
"INSERT INTO employees VALUES (?, ?)");
stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();
stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();
// 提交要執行的批處理
int[] updateCounts = stmt.executeBatch();
</pre>
</blockquote>
<p><a name="283494"></a></p>
<p>最后,它將調用 <code>PreparedStatement.executeBatch()</code> 來將更新傳給
DBMS。對于 <code>PreparedStatement </code>對象,其錯誤處理類似于對 <code>Statement</code>
對象的錯誤處理。</p>
<p><a name="283558"></a> </p>
<h4>6.1.3 可調用語句</h4>
<p>批處理更新功能使用 <code>CallableStatement</code>
對象進行工作的方式與使用 <code>PreparedStatement</code>
對象進行工作的方式相同。多個輸入參數值的集合可以與可調用語句相關聯,然后一起送交給
DBMS。批處理更新功能與可調用語句一起使用所調用的存儲過程必須返回更新計數,而且可以不必有輸出或輸入輸出參數。如果違反這個限制條件,則
<code>CallableStatement.executeB atch()</code> 方法會拋出異常。</p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc2.0.frame.html">
<p>目錄</a> | <a href="jdbc2.0.frame5.html">上一頁</a> | <a
href="jdbc2.0.frame7.html">下一頁</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@eng.sun.com">jdbc@eng.sun.com</a> 或 <a
href="mailto:jdbc-business@eng.sun.com">jdbc-business@eng.sun.com</a>
</address>
<a href="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版權所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有權利</i></font>。</a><!-- HTML generated by Suzette Pelouch on June 09, 1998 -->
</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -