最速の方法は、データベースに接続して多数のステートメントを使用するのではなく、データベース自体ですべての挿入/更新を実行することだと思います。
これは Oracle 固有のものですが、他のデータベースにも同様の概念がある可能性があることに注意してください。
次のアプローチを使用します。まず、Excel データを CSV ファイルとしてデータベース サーバーに保存し ( /mydatadir/mydata.csv
)、次に Oracle で外部テーブルを使用します。
create or replace directory data_dir as '/mydatadir/';
create table external_table (
id number(18),
name varchar2(30),
otherfield1 varchar2(40),
otherfield2 varchar2(40))
organization external (
type oracle_loader
default directory data_dir
access parameters
( fields terminated by ',' )
location ('mydata.csv')
)
(注: 外部テーブルは毎回設定する必要はありません)
次に、次のコマンドを使用して、データをテーブルにマージできます。
merge into yourtable t
using external_table e
on t.name = e.name
when matched then
update set t.id = e.id,
t.otherfield1 = e.otherfield1,
t.otherfield2 = t.otherfield2
when not matched then
insert (t.id, t.name, t.otherfield1, t.otherfield2)
values (e.id, e.name, e.otherfield1, e.otherfield2)
これにより、1 つの Oracle コマンドで行がアップサートyourtable
されるため、すべての作業はデータベースによって実行されます。
編集:
このmerge
コマンドは、プレーンな JDBC を介して発行できます (ただし、Spring のSimpleJdbcTemplateを使用することを好みます) 。
EDIT2:
MySQL では、次の構成を使用してマージを実行できます。
insert into yourtable (id, name, otherfield1, otherfield2)
values (?, ?, ?, ?),
(?, ?, ?, ?),
(?, ?, ?, ?) --repeat for each row in the Excel sheet...
on duplicate Key update
set otherfield1 = values(otherfield1),
otherfield2 = values(otherfield2)
これはプレーンな JDBC ステートメントとして発行でき、個別の更新と挿入よりも優れています。これらをスプレッドシートから (たとえば) 100 行のバッチで呼び出すことができます。これは、Excel シートの 100 行ごとに 1 回の JDBC 呼び出しを意味し、適切に実行されるはずです。これにより、外部テーブルなしでそれを行うことができます (これを機能させるには、name 列に UNIQUE インデックスが必要です。変更が必要な場合に外部キーで問題が発生する可能性があるため、主キーは変更しません)誰かの名前)。
MySQLには外部テーブルの概念もあります。これは、上記のようにデータをバッチとして挿入するよりも高速だと思います。csv ファイルが正しい場所にアップロードされている限り、インポートは迅速に行われます。