MySQLデータベースで数百万件のデータを10秒間で挿入
まず、問題を考えてみよう。
これだけ膨大なデータをデータベースに挿入するには、頻繁にアクセスするのが普通の状況に違いないが、どんなマシンやデバイスもそんな余裕はない。では、どうすればデータベースへの頻繁なアクセスを避けることができ、一度だけ実行することができるでしょうか?
実はJavaがその答えを出してくれているんです。
ここでは、2つの重要なオブジェクトが登場する。
[root@hailiang tmp]# modinfo helloworld.ko
filename: helloworld.ko
alias: a simplest module
description: A simple helloworld module
author: zhanghailiang
depends:
vermagic: 2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS
ステートメント
#include <linux/utsrelease.h>
#include <linux/module.h>
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
。。。。。。。。。。。。。。。。。。。
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MO
DVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif
#define VERMAGIC_STRING /
UTS_RELEASE " " /
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT /
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS /
MODULE_ARCH_VERMAGIC
両者の特徴を見てみましょう。
使用するBaseDaoツールクラス(jarパッケージ/Maven依存)(Maven依存コードは文末に添付)(使いやすいようにラップしてあります。)
注:(強調)rewriteBatchedStatements=trueで、複数のデータを一度に挿入、一度だけ!。
[root@hailiang 2.6.27.5-117.fc10.i686]# make menuconfig
scripts/kconfig/mconf arch/x86/Kconfig
# make menuconfig
# configuration written to .config
# configuration written to .config
*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.
[root@hailiang 2.6.27.5-117.fc10.i686]# make
scripts/kconfig/conf -s arch/x86/Kconfig
CHK include/linux/version.h
CHK include/linux/utsrelease.h
make[1]: *** No rule to make target `missing-syscalls'. Stop.
make: *** [prepare0] Error 2
次に、キーコードとコメントです。
/* Because the database is incredibly fast, the single throughput is very high and the execution is very efficient.
addBatch() loads a number of sql statements together and sends them to the database for execution one at a time, which takes a very short time to execute
while preparedStatement.executeUpdate() is sent to the database one by one for execution time is consumed in the database connection transfer *public static void main(String[] args) {
long start = System.currentTimeMillis(); // Get the current time of the system, before the method begins to execute the record
Connection conn = BaseDao.getConn(); // call the static tool class just written to get the connection to the database object
String sql = "insert into mymilliontest values(null,? ,? ,? ,NOW())"; // the sql statement to be executed
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql); // get PreparedStatement object
// keep generating sql
for (int i = 0; i < 1000000; i++) {
ps.setString(1, Math.ceil(Math.random() * 1000000) + "");
ps.setString(2, Math.ceil(Math.random() * 1000000) + "");
ps.setString(3, UUID.randomUUID().toString()); // UUID This class is used to generate a random string that will not be repeated
ps.addBatch(); // Add a set of parameters to the batch command of this PreparedStatement object.
}
int[] ints = ps.executeBatch(); // submits a batch of commands to the database for execution and returns an array of update counts if all commands are executed successfully.
// If the length of the array is not 0, then the sql statement is executed successfully, i.e. millions of data are added successfully!
if (ints.length > 0) {
System.out.println("One million pieces of data have been successfully added! ");
"); }
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
BaseDao.closeAll(conn, ps); // call the static tool class just written to release resources
}
long end = System.currentTimeMillis(); // get the system time again
System.out.println("duration:" + (end - start) / 1000 + "seconds"); // subtract the two times to be the duration of the method execution
}
最後に、効果を確認するために実行します。
ねえ、ここで10秒以上の長さは、デバイスはほとんど意味が、ハ〜を理解するために願っています。
<! -- mysql-connector-java dependencies used to connect to the database -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
PS : スレッドを追加することでより高速になりますが、それは次の記事で例示します。
この記事は、MySQLデータベースが数百万件のデータを10秒で挿入することについてのすべてです。MySQLが数百万件のデータを挿入することについての詳細は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き参照してください。
関連
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
mysqlにおけるvarcharの日付比較とソートの実装
-
MySQLのselect、distinct、limitの使い方
-
MySQLのNULLについて解説した記事
-
Mysqlデータベースの手動および定期的なバックアップ手順
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
MySQLにおけるorder byの使用方法の詳細
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
MySQLデータ型の詳細
-
SpringBootのMySQLへの接続は、バックエンドのインターフェイスの操作方法を書き込むためのデータを取得するために
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
SQLException。オペランドは1列でなければなりません。