一括挿入データについて
8235 ワード
テストデータベースはmysql!!!
方法1:public
出力時間:cast:23 ms
この方法は現在テストが最も効率的な方法です!
方法2:
コンソール出力:cast:111 ms
実行時間は上記の方法の5倍です!
方法3:
この方法はspring batchUpdateで実行され、効率の問題でデータ量は1万本しかありません!
実行時間:cast:387 ms
まとめ:方法1と方法2はよく似ていて、唯一違うのは方法1が採用したのは「insert into tb(...)values(...),(...)...;”のように挿入操作を行い、
方法2は「insert into tb(...)values (...);insert into tb (...) values (...);...”の方法で、テストでなければ、私も両者の差がこんなに大きいことを知りません!
もちろん、これは現在のテストにすぎず、具体的な実行時間とステップ長も大きく関係しています.歩幅を100に変更すると、方法は数分かかるかもしれませんが、これは自分でテストすることができます.の
方法三網では推奨されているが、効率は誰もが見ているように、1万件の記録で、6分もかかり、効率が理想的ではないことがわかる.さらにメソッド3はspringアプリケーションContext環境を構成しなければ適用できません!
しかし、方法3はssh/spring-mvcで可用性が高い!
方法1:public
static
void
insert
() {
//
Long
begin
= new
Date
().getTime();
// sql
String prefix =
"INSERT INTO tb_big_data (count, create_time, random) VALUES "
;
try {
// sql
StringBuffer suffix = new StringBuffer();
//
conn.setAutoCommit(
false
);
// Statement st = conn.createStatement();
// st,pst
PreparedStatement pst = conn.prepareStatement(
""
);
// ,
for
(
int
i = 1; i <= 100; i++) {
//
for
(
int
j = 1; j <= 10000; j++) {
// sql
suffix.append(
"("
+ j * i +
", SYSDATE(), "
+ i * j
* Math.random() +
"),"
);
}
// sql
String sql = prefix + suffix.
substring
(0, suffix.length() - 1);
// sql
pst.addBatch(sql);
//
pst.executeBatch();
//
conn.
commit
();
//
suffix = new StringBuffer();
}
//
pst.
close
();
conn.
close
();
} catch (SQLException e) {
e.printStackTrace();
}
//
Long
end
= new
Date
().getTime();
//
System.
out
.println(
"cast : "
+ (
end
-
begin
) / 1000 +
" ms"
);
:
}
出力時間:cast:23 ms
この方法は現在テストが最も効率的な方法です!
方法2:
public
static
void insertRelease() {
Long
begin
= new
Date
().getTime();
String sql =
"INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)"
;
try {
conn.setAutoCommit(
false
);
PreparedStatement pst = conn.prepareStatement(sql);
for
(
int
i = 1; i <= 100; i++) {
for
(
int
k = 1; k <= 10000; k++) {
pst.setLong(1, k * i);
pst.setLong(2, k * i);
pst.addBatch();
}
pst.executeBatch();
conn.
commit
();
}
pst.
close
();
conn.
close
();
} catch (SQLException e) {
e.printStackTrace();
}
Long
end
= new
Date
().getTime();
System.
out
.println(
"cast : "
+ (
end
-
begin
) / 1000 +
" ms"
);
}
コンソール出力:cast:111 ms
実行時間は上記の方法の5倍です!
方法3:
public
static
void insertBigData(SpringBatchHandler sbh) {
Long
begin
= new
Date
().getTime();
JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();
final
int
count
= 10000;
String sql =
"INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)"
;
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
// prepared statement 。
public
void setValues(PreparedStatement pst,
int
i)
throws SQLException {
pst.setLong(1, i);
pst.setInt(2, i);
}
//
public
int
getBatchSize() {
return
count
;
}
});
Long
end
= new
Date
().getTime();
System.
out
.println(
"cast : "
+ (
end
-
begin
) / 1000 +
" ms"
);
}
この方法はspring batchUpdateで実行され、効率の問題でデータ量は1万本しかありません!
実行時間:cast:387 ms
まとめ:方法1と方法2はよく似ていて、唯一違うのは方法1が採用したのは「insert into tb(...)values(...),(...)...;”のように挿入操作を行い、
方法2は「insert into tb(...)values (...);insert into tb (...) values (...);...”の方法で、テストでなければ、私も両者の差がこんなに大きいことを知りません!
もちろん、これは現在のテストにすぎず、具体的な実行時間とステップ長も大きく関係しています.歩幅を100に変更すると、方法は数分かかるかもしれませんが、これは自分でテストすることができます.の
方法三網では推奨されているが、効率は誰もが見ているように、1万件の記録で、6分もかかり、効率が理想的ではないことがわかる.さらにメソッド3はspringアプリケーションContext環境を構成しなければ適用できません!
しかし、方法3はssh/spring-mvcで可用性が高い!