2009-03-04 9 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(); 
    } 

(繰り返しますが、これは実際のコード、ちょうど簡単な例ではありません)

一般に、私はラウンドトリップトラフィックを減らすために、1つのステートメントで複数の挿入/更新ステートメントを実行しようとしています。これを行うには効果的な方法ですか、それともより受け入れられるアプローチがありますか?

1回のトランザクションで何千もの文がある可能性があります。私はおそらく単一のステートメントの実行でタイムアウトを防ぐために、ステートメントを合理的なサイズのブロックに分割するでしょう。

私は複数のDBベンダーをサポートしていますが、ANSI SQLを使用しているので、問題はないはずです。必要なら私はDALのインテリジェンスを活用することができます。したがって、これは問題ではありません。

ヒント/ご提案はありますか?

答えて

0

PreparedStatementは、addBatchexecutebatchを使用して、異なる引数を使用して同じステートメントを送信するバッチをサポートしています。私は、クロスデータベースプラットフォームの方法で複数のパラメータ化された文を実行する良い方法はないと思います。伝統的には、これは[evil]ストアドプロシージャによって処理されます。

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

、あなたの場合は、パフォーマンス比較が心配再、あなたはまた、PreparedStatementのプーリングをサポートしますdbcpなどの接続プーリングパッケージを使用して検討すべきです。 c3p0も人気がありますが、私はそれについての経験はありません。

関連する問題