2017-11-06 8 views
0

mysqlテーブルにjavaコードで20行を挿入する必要があるとします。次のどの方法が効率的で、なぜ有効になるか。MySQLテーブルに複数の行を挿入する:スレッド化とBatchUpdateの比較

1)のexecuteBatchを使用して1つのバッチにすべての挿入文を作成し、その後を使用しては、一度にすべての行を挿入するためのPreparedStatementの方法をコミットします。

2)挿入ごとにスレッドを作成します。各スレッドは1つの行を挿入します。

PS:挿入はWeb APIを介して行われるため、ステータス(挿入に失敗したかどうかを問わず)がリアルタイムで必要です。

+1

私はがexecuteBatchはそれが1デシベルの呼び出しとパフォーマンスに挿入を行いますので、それ自体が複数のスレッドがこれらの挿入が遅くなり、はるかに優れた選択肢である、とDBプールからの複数のソケット接続可能かもしれない使用されますと言うでしょうまた、接続が1つしかない場合、他のすべてのスレッドはその接続を使用するのを待ちます。 –

+0

おそらくデータがどれほど価値があるかによって異なります。場合によっては、何かをアーカイブする必要があるときに、リアルタイムのデータが必要ないときにデータベースに書き込むリンクキューを持つスレッドがあり、メインスレッドはそのキューにレコードを追加して処理します。 – Marvin

+0

@Marvin。これは、マルチスレッドが第1オプションより遅いことを意味します。私はリアルタイムでそれが必要です。 –

答えて

1

以下の説明にお答えください。

一般的に、一括挿入は、すべての挿入ステートメントで発生していた中間的な通信を回避するため、一度に1つの挿入よりも高速です。

しかし、挿入/更新ステートメントがテーブル/行の排他ロックを取得するため、その時点で他のプロセス/接続がテーブルを使用できないという問題が発生することがあります。

あなたがテーブルから読んでいると、いくつかは、その後、全体の動作を記述しているそのうちのいくつかは同じでDBを使用して、複数のプロセスがロックされます/一括挿入

の時点で停止している場合はそうバルク挿入がロックしますロック時間が長くなり、DBがチューニングされていない場合、他のプロセスに問題を引き起こす可能性のある単一の挿入よりも時間がかかることがあります。

他の操作を行わずにDBに挿入するだけの場合は、ファイルから一括挿入する方がはるかに高速です。他のプロセスがある場合は、ロックを考慮して一括挿入頻度を調整してください。

回答がここに与えられます。 使用php2java.comは、Javaによると、このコードを変換し、あなたが必要なものを見るために:Performance Multiple inserts or multiple values single insert

+0

この回答をお持ちですか?それは1スレッドを介して1つの行を挿入してマルチスレッドと比較して話をしません。 –

+0

はい、「挿入ごとにスレッドを作成する」とは、複数の単一挿入を意味します。したがって、各スレッドは1回の挿入を行い、DBは何度もヒットするでしょう。 –

+0

しかし、これらは「連続した」複数の単一挿入ではありません。だから私たちはあなたの答えから時間効率を比較することはできません。 –

0

は、これは私がSQLデータベースへの複数のインスタンスを追加する方法です。

global $db; //create database object 
//if database tables does not exist already create them 
     if($db->query('SELECT 1 from store_access') == FALSE) { 
      $query = 'CREATE TABLE store_access (
       `access_id` bigint(20) NOT NULL AUTO_INCREMENT, 
       `user_id` bigint(20) NOT NULL, 
       `store_id` bigint(20) NOT NULL, 
       `sales` bigint(20) NOT NULL, 
       `purchase` bigint(20) NOT NULL, 
       `vendors` bigint(20) NOT NULL, 
       `clients` bigint(20) NOT NULL, 
       `products` bigint(20) NOT NULL, 
       `warehouse` bigint(20) NOT NULL, 
       `returns` bigint(20) NOT NULL, 
       `price_level` bigint(20) NOT NULL, 
       `reports` bigint(20) NOT NULL, 
       `expenses` bigint(20) NOT NULL, 
       PRIMARY KEY (`access_id`) 
      )'; 
      $result = $db->query($query) or die($db->error); 
      echo 'Store Access Table created.<br>'; 
     } //creating user level table ends. 
関連する問題