まず、3つのJDBCバッチ挿入プログラミング方法が導入され、それらを比較します。特定のコンテンツは次のとおりです
JDBCバッチ挿入は、ログが一般的に最初にファイルに記述されるため、主にデータのインポートとロギングに使用されます。
MySQL 5.1.5のJDBCドライバーを使用して、より一般的に使用される3つの方法をテストしました
方法1:準備したステートメントを使用してバッチを追加します
try {class.forname( "com.mysql.jdbc.driver"); conn = drivermanager.getConnection(o_url、username、password); conn.setautocommit(false); string sql = "adlogs(ip、webサイト、yyyymmdd、hour、object_id)values(?、?、?、?、?)"; preatedStatement perst = conn.preparestatement(sql、resultset.type_scroll_sensitive、resultset.concur_read_only); for(int x = 0; x <size; x ++){prest.setString(1、 "192.168.1.1"); prest.setString(2、 "localhost"); prest.setString(3、 "20081009"); prest.setint(4、8); prest.setString(5、 "11111111"); prest.addbatch(); } prest.executeBatch(); conn.commit(); conn.close(); } catch(sqlexception ex){logger.getLogger(mylogger.class.getname())。log(level.severe、null、ex); } catch(classNotFoundException ex){logger.getLogger(mylogger.class.getName())。log(level.severe、null、ex); }ステートメントを作成するときの次の2つのパラメーターの意味を説明してください。
最初のパラメーターは、結果のタイプを指定します。オプションは次のとおりです。
type_forward_only:デフォルトタイプ。フォワードアクセスは1回しか許可されておらず、他のユーザーがデータベースに加えた変更の影響を受けません。
type_scroll_insensive:リスト内のフォワードまたはバックワードの動き、およびリストの4番目のレコードに移動したり、現在の位置から2つのレコードを後方に移動するなど、特定のポジショニングを可能にします。他のユーザーがデータベースに加えた変更の影響はありません。
type_scroll_sensitive: type_scroll_insensiveと同様に、ポジショニングはレコードで許可されています。このタイプは、他のユーザーによる変更の影響を受けます。ユーザーがクエリを実行した後にレコードを削除すると、そのレコードは結果セットから消えます。同様に、データ値の変更は結果セットに反映されます。
2番目のパラメーターは、結果セットの並行性を設定し、結果を更新できるかどうかを決定します。オプションは次のとおりです。
concur_read_only:これはデフォルト値であり、更新できないことを指定しています
Resultset concur_updatable:結果を更新できることを指定します
方法2:ステートメントを使用してバッチメソッドを追加します
conn.setautocommit(false);ステートメントstmt = conn.createstatement(resultset.type_scroll_sensitive、resultset.concur_read_only); for(int x = 0; x <size; x ++){stmt.addbatch( "adlogs(ip、webサイト、yyyymmdd、hour、object_id)values( 'localhost'、 '20081009'、8、 '23123')") } stmt.executeBatch(); conn.commit();方法3:ステートメントを直接使用します
conn.setautocommit(false);ステートメントstmt = conn.createstatement(resultset.type_scroll_sensitive、resultset.concur_read_only); for(int x = 0; x <size; x ++){stmt.execute( "adlogs(ip、webサイト、yyyymmdd、hour、object_id)values( '192.168.1.3'、 'localhost'、 '20081009'、8、 '23123')"); } conn.commit();上記の方法を使用して100,000個のデータを挿入するための平均テスト時間は次のとおりです。
方法1: 17.844S
方法2: 18.421S
方法3: 16.359S
JDBCバッチステートメントの挿入は、パフォーマンスを改善しないだけでなく、バッチが使用されない場合よりも遅いことがわかります。もちろん、これはJDBCの特定のドライバーの実装方法に関連している可能性があります。添付ファイルは私のテストコードであり、コンピューターで実行するために使用できます。
バッチ挿入を実行する場合、最も重要なことは、提出物を自動的にキャンセルすることです。そのため、JDBCのバッチ構文が使用されるかどうかは関係ありません。
conn.setautocommit(false)
個人的には、最初の方法が最も便利で実用的だと思います。
JDBCバッチ挿入データの例の説明:
最近、Excelデータをデータベースにインポートするプログラムに取り組んでいたとき、大量のデータのためにJDBCバッチ挿入を使用する準備をしていました。 SOPREATESTEMENT.ADDBATCH()が使用されます。 1Wのデータが追加されると、挿入操作が実行され、preatedStatement.executeBatch()が使用されます。これは速いと思っていましたが、65,536個のデータを挿入するのに30分以上かかりましたが、これは私の期待を完全に超えていました。そこで、同僚に、この種の大規模なデータのインポートをどのように処理したかを尋ねました。彼らはまた、JDBCバッチ挿入処理を使用していることがわかりましたが、私とは異なり、彼らはcon.setautocommit(false)を使用しました。次に、reprentStatement.executeBatch()を作成し、con.commit()を実行しました。それで私はもう一度試しました、奇跡とは何ですか?これらのデータをインポートするのに30分かかり、これら2つの文を追加した後、完了するのに15秒しかかかりませんでした。そこで、理由を確認して、次の説明をオンラインで見つけました。
* INNODBにデータをインポートするときは、MySQLにAutoCommitモードが有効になっていないことを確認してください。
インサートごとにログフラッシュをディスクにフラッシュする必要があります。輸入操作中にオートコンミットを無効にするには、
自動委員会とコミットステートメントを設定します。
autocommit = 0を設定します。
... SQLインポートステートメント...
専念;
初めて、それはまさにsetautocommit(false)がないためです。各挿入ステートメントについて、ログがディスクに生成されます。したがって、バッチインサートは設定されていますが、その効果は単一の挿入物のようなもので、非常に遅い挿入が行われます。
コードの一部は次のとおりです。
string sql = "テーブルへの挿入*****"; con.setautocommit(false); ps = con.preparestatement(sql); for(int i = 1; i <65536; i ++){ps.addbatch(); // 1W Recordsを1回挿入if(i%10000 == 0){ps.executeBatch(); con.commit(); }} // 1w未満のデータを挿入しますps.executeBatch(); con.commit();上記は単なるサイドディッシュであり、次に「サーブ」に続きます。
1。バッチ書き込みデータをテストします
long start = system.currenttimemillis(); daorecord daorecord = new daorecord();リスト<t> list = new ArrayList <T>(); for(int i = 1; i <= 1000; i ++){for(int j = 1; j <= 1000; j ++){t t = new t(); t.seti(i); t.setj(j); list.add(t); }} daorecord.insertbatch(list); system.out.println( "time-suming:" +(system.currenttimemillis() - start) + "ms"); 2。バッチ書き込みデータテスト
public void insertBatch(list <t> list){string sql = "t(go、back)values(?、?)"; dbhelper dbh = new dbhelper(sql);接続conn = dbh.returnconn(); try {conn.setautocommit(false); //この文はfalseでなければならないことに注意してください。 for(int i = 0; i <list.size(); i ++){ps.setint(1、list.get(i).geti()); ps.setint(2、list.get(i).getj()); ps.addbatch(); if(i%10000 == 0){ps.executeBatch(); conn.commit(); }} ps.executeBatch(); conn.commit(); conn.close(); } catch(sqlexception e){// todoは自動的に生成されましたe.printstacktrace(); }}データ表:
実験結果:
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。