まず、次の質問について考えてみましょう。 このような膨大な量のデータをデータベースに挿入するには、通常の状況では頻繁にアクセスする必要があり、いかなる機械設備でも処理できません。では、データベースへの頻繁なアクセスを回避するにはどうすればよいでしょうか? 一度アクセスしてから実行することはできますか? Java は実際に答えを与えてくれました。 ここでは、 2つの特徴を見てみましょう。 使用する BaseDao ツール クラス (jar パッケージ/Maven 依存関係) (Maven 依存関係コードは記事の最後に添付されています) (簡単に使用できるようにパッケージ化されています) 注意: (重要) rewriteBatchedStatements=true の場合、一度に複数のデータを挿入し、一度だけ挿入してください。 ! public class BaseDao { // 静的ツールクラス。データベース接続オブジェクトを作成し、簡単に呼び出せるようにリソースを解放するために使用されます // ドライバー jar パッケージをインポートするか、Maven 依存関係を追加します (ここでは Maven が使用され、Maven 依存関係コードは記事の最後に添付されています) 静的{ 試す { クラス.forName("com.mysql.cj.jdbc.Driver"); } キャッチ (ClassNotFoundException e) { e.printStackTrace(); } } // データベース接続オブジェクトを取得する public static Connection getConn() { 接続 conn = null; 試す { // rewriteBatchedStatements=true、一度に複数のデータを挿入、一度だけ挿入conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/million-test?rewriteBatchedStatements=true", "root", "qwerdf"); } catch (SQLException スロー可能) { throwables.printStackTrace(); } conn を返します。 } // リソースを解放する public static void closeAll(AutoCloseable... autoCloseables) { (AutoCloseable autoCloseable : autoCloseables) の場合 { 自動クローズ可能 != null の場合 { 試す { 自動クローズ可能。 } キャッチ (例外 e) { // TODO 自動生成されたキャッチブロック e.printStackTrace(); } } } } } 次にキーコードとコメントを示します。 /* データベースの処理速度が非常に速いため、単一のスループットが非常に大きく、実行効率が非常に高くなります。addBatch() は、複数の SQL 文をまとめて読み込み、データベースに送信して一度に実行します。実行には非常に短い時間しかかかりません。preparedStatement.executeUpdate() は、それらを 1 つずつデータベースに送信して実行し、データベース接続の転送に時間がかかります。*/ パブリック静的voidメイン(String[] args) { long start = System.currentTimeMillis(); // メソッドの実行を開始する前に、システムの現在の時刻を取得して記録します。 Connection conn = BaseDao.getConn(); // 接続データベース オブジェクトを取得するために記述したばかりの静的ツール クラスを呼び出します。 String sql = "insert into mymilliontest values(null,?,?,?,NOW())"; // 実行される SQL ステートメント PreparedStatement ps = null; 試す { ps = conn.prepareStatement(sql); // PreparedStatement オブジェクトを取得する // 継続的に sql を生成する (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 クラスは、繰り返されない文字列をランダムに生成するために使用されます。 ps.addBatch(); // この PreparedStatement オブジェクトのバッチ コマンドに一連のパラメーターを追加します。 } int[] ints = ps.executeBatch(); // 実行のためにコマンドのバッチをデータベースに送信します。すべてのコマンドが正常に実行されると、更新カウントの配列が返されます。 // 配列の長さが 0 でない場合は、SQL ステートメントが正常に実行され、100 万個のデータが正常に追加されたことを意味します。 (ints.length > 0)の場合{ System.out.println("100 万件のレコードが正常に追加されました!!"); } } catch (SQLException スロー可能) { throwables.printStackTrace(); ついに BaseDao.closeAll(conn, ps); // リソースを解放するために記述した静的ツール クラスを呼び出します} long end = System.currentTimeMillis(); // システム時間を再度取得します System.out.println("所要時間: " + (end - start) / 1000 + "秒"); // 2 つの時間を減算すると、メソッドの実行にかかった時間になります} 最後に、実行して効果を確認しましょう。 ねえ、ここの持続時間は10秒以上です、装備が十分ではありません、ご理解いただければ幸いです〜 <!--データベースへの接続に使用されるmysql-connector-java依存関係--> <依存関係> <グループID>mysql</グループID> <artifactId>mysql-コネクタ-java</artifactId> <バージョン>8.0.27</バージョン> </依存関係> PS: スレッドを追加するとさらに高速になります。後続の記事で例を示します。 これで、10 秒以内に 100 万件のレコードを MySQL データベースに挿入する方法についての説明は終わりです。MySQL に 100 万件のレコードを挿入する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
使用 <div id="アプリ"> <router-link ...
1. 問題時々Mysqlにログインしてパスワードを入力すると、この状況が発生しますmysql -u...
プロセス1: 戻り値あり: proc_addNum が存在する場合はプロシージャを削除します。 プロ...
目次1. MacへのDockerのインストール2. Win 10 システムでの Docker のイン...
序文まず、高性能サーバーの高可用性またはホットスタンバイソリューションである Keepalived ...
本日実装する機能は、以下の機能です。vue.js シミュレーションカレンダープラグインさて、もう無駄...
今日は、Linux ホスト上で 4 つの MySQL データベースを起動する方法について説明します。...
入力タグタイプがファイルで、タグ内にaccpet="image/*"属性が設定さ...
CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...
事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...
背景MySQL のデッドロックについて言えば、私は以前 MySQL のロックに関する基本的な紹介記事...
マクロタスクとマイクロタスクJavaScript はシングルスレッド言語です (マルチスレッドの場合...
目次序文解決具体的な実装満たすべき前提条件質問序文テーブルをよく使用します。データ量が多い場合は直接...
効果画像: 1. はじめに独自のアプレットでこのような機能を実装する必要がある1. 核となる考え方ス...
インストールと設定Apacheの公式ウェブサイトには多くのミラーダウンロードアドレスが用意されており...